微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试使用准备好的语句占位符作为聚合函数的参数时的 JDBC 异常

如何解决尝试使用准备好的语句占位符作为聚合函数的参数时的 JDBC 异常

我正在尝试使用 PreparedStatement 占位符作为 sql 聚合函数的参数。如果我将 ? 占位符替换为数值并去掉 setDouble 调用,则查询工作正常。

    public static String QUERY = """
            SELECT DS_GET_QUANTILE(DS_QUANTILES_SKETCH("logins"),?)  as "rank"
            FROM (SELECT ip,sum("login-counts") AS "attempts"
                  FROM "my-datasource"
                  WHERE __time >= CURRENT_TIMESTAMP - INTERVAL '30' DAY
                  GROUP BY 1)
            """;

    void queryFails() throws sqlException {
        var connection = jdbcTemplate.getJdbcTemplate().getDataSource().getConnection();
        var preparedStatement = connection.prepareStatement(QUERY);
        preparedStatement.setDouble(1,.75);
        var resultSet = preparedStatement.executeQuery();
    }

错误是:

org.apache.calcite.avatica.AvaticasqlException: Error -1 (00000) : while preparing sql: SELECT DS_GET_QUANTILE(DS_QUANTILES_SKETCH("attempts"),?)  as "rank"
FROM (SELECT ip,sum("login-login_attempts") AS "attempts"
      FROM "metrics-default"
      WHERE __time >= CURRENT_TIMESTAMP - INTERVAL '30' DAY
      GROUP BY 1)

    at org.apache.calcite.avatica.Helper.createException(Helper.java:54)
    at org.apache.calcite.avatica.Helper.createException(Helper.java:41)
    at org.apache.calcite.avatica.AvaticaConnection.prepareStatement(AvaticaConnection.java:358)
    at org.apache.calcite.avatica.AvaticaConnection.prepareStatement(AvaticaConnection.java:175)
    at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337)
    at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java)
...
java.lang.RuntimeException: org.apache.calcite.tools.ValidationException: org.apache.calcite.runtime.CalciteContextException: From line 1,column 8 to line 1,column 58: Cannot apply 'DS_GET_QUANTILE' to arguments of type 'DS_GET_QUANTILE(<OTHER>,<ANY>)'. Supported form(s): 'DS_GET_QUANTILE(<ANY>,<NUMERIC>)'
    at org.apache.druid.sql.avatica.DruidStatement.closeAndPropagateThrowable(DruidStatement.java:377)
    at org.apache.druid.sql.avatica.DruidStatement.prepare(DruidStatement.java:181)
    at org.apache.druid.sql.avatica.DruidMeta.prepare(DruidMeta.java:158)

它似乎将 ? 传递给未替换的数据库

这是 avatica 驱动程序中的错误还是查询的某些区域中不允许使用占位符?

解决方法

鉴于根本原因错误消息:

java.lang.RuntimeException: org.apache.calcite.tools.ValidationException: org.apache.calcite.runtime.CalciteContextException:从第 1 行开始, 第 8 列到第 1 行,第 58 列:无法将“DS_GET_QUANTILE”应用于 'DS_GET_QUANTILE(,)' 类型的参数。支持的 表单:'DS_GET_QUANTILE(,)'

这是参数类型推断的问题。尝试将参数显式转换为数字类型,例如cast(? as double)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?