提问者:小点点

AWS雅典娜JDBC准备声明


我不能让AWSAthena JDBC驱动程序与准备语句和绑定变量一起工作。如果我将列的期望值直接放在SQL字符串中,它就有效。但是如果我使用占位符“?”并且我将变量与准备语句的设置器绑定,它就不起作用。当然,我们知道我们必须使用第二种方法(对于缓存,避免SQL注入等等)。

我使用JDBC DriverAthenaJDBC42_2.0.2。jar。当我尝试在SQL字符串中使用占位符'?'时,我遇到了以下错误。当我从JDBC连接中获取准备语句时,会引发该错误。它抱怨找不到参数。但是我在代码中设置了它们。如何在获取准备语句之前设置参数:-)?

java.sql.SQLException: [Simba][AthenaJDBC](100071) An error has been thrown from the AWS Athena client. SYNTAX_ERROR: line 1:1: Incorrect number of parameters: expected 1 but found 0

at com.simba.athena.athena.api.AJClient.executeQuery(Unknown Source)
at com.simba.athena.athena.dataengine.AJQueryExecutor.<init>(Unknown Source)
at com.simba.athena.athena.dataengine.AJDataEngine.prepare(Unknown Source)
at com.simba.athena.jdbc.common.SPreparedStatement.<init>(Unknown Source)
at com.simba.athena.jdbc.jdbc41.S41PreparedStatement.<init>(Unknown Source)
at com.simba.athena.jdbc.jdbc42.S42PreparedStatement.<init>(Unknown Source)
at com.simba.athena.jdbc.jdbc42.JDBC42ObjectFactory.createPreparedStatement(Unknown Source)
at com.simba.athena.athena.jdbc42.AJJDBC42ObjectFactory.createPreparedStatement(Unknown Source)
at com.simba.athena.jdbc.common.SConnection.prepareStatement(Unknown Source)
at com.simba.athena.jdbc.common.SConnection.prepareStatement(Unknown Source)
at ****************************************************
Caused by: com.simba.athena.support.exceptions.GeneralException: [Simba][AthenaJDBC](100071) An error has been thrown from the AWS Athena client. SYNTAX_ERROR: line 1:1: Incorrect number of parameters: expected 1 but found 0
... 37 more

我做错什么了吗?这是密码

    @Test
public void testWhichFails() throws SQLException {
    try (Connection connection = athenaConnexion()) {
        String sql = "select * from my_table where col = ? limit 10";
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            ps.setInt(1, 30);
            try (ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    System.out.println("rs.getString(1) = " + rs.getString(1));
                }
            }
        }
    }
}

@Test
public void testWhichWorks() throws SQLException {
    try (Connection connection = athenaConnexion()) {
        String sql = "select * from my_table where col = 30 limit 10";
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            //ps.setInt(1, 30);
            try (ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    System.out.println("rs.getString(1) = " + rs.getString(1));
                }
            }
        }
    }
}

共2个答案

匿名用户

雅典娜仅支持此处列出的SQL函数雅典娜SQL函数,这些函数又基于函数和运算符Presto 0.172版,下面列出了雅典娜的SQL相关限制。准备好的语句可以在新版Presto Presto文档中使用。但是,雅典娜还不支持这个新版本。您可以随时写信给雅典娜支持团队,要求添加PREPARE函数。

匿名用户

目前,我认为Athena JDBCjar不支持带位置变量的预准备语句。在使用myBatis时,预准备语句变量#{变量}不起作用,而字符串替换${变量}起作用。

  • 从my_table中选择*,其中coll=#{coll}limited 10不起作用
  • 从my_table中选择*,其中coll=${coll}limited 10没有工作

我认为发生错误是因为Athena SConnection对象不支持位置变量,但由于我没有源代码,我无法验证。