amazon-web-services - AWS Athena JDBC PreparedStatement
问题描述
我无法使 AWS Athena JDBC 驱动程序与 PreparedStatement 和绑定变量一起使用。如果我将所需的列值直接放在 SQL 字符串中,它就可以工作。但是如果我使用占位符'?我将变量与 PreparedStatement 的设置器绑定,它不起作用。当然,我们知道我们必须使用第二种方法(用于缓存,避免 SQL 注入等)。
我使用 JDBC 驱动程序 AthenaJDBC42_2.0.2.jar。尝试使用占位符 '?' 时出现以下错误 在 SQL 字符串中。当我从 JDBC 连接获取 PreparedStatement 时,会引发错误。它抱怨找不到参数。但是我在代码中设置了它们。在获取 PreparedStatement 之前如何设置参数:-)?
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));
}
}
}
}
}
解决方案
Athena 仅支持此处列出的 SQL 函数Athena SQL 函数又基于Functions and Operators Presto 版本 0.172,并具有以下Athena 的 SQL 相关限制列表。新版 Presto Presto 文档中可以使用准备好的语句。但是,Athena 还不支持这个新版本。您可以随时写信给 Athena 支持团队,要求添加 PREPARE 功能。
推荐阅读
- c# - 如何在 Xml 元素中添加 if 条件
- python - 当我打开现有文件时 gVim 什么也不显示
- spring - spring initializr:spring-boot-starter vs spring-boot-starter-web
- heroku - 如何使用 Heroku 部署的 Flask 应用程序处理 model.predict 上的超时错误?
- python - 删除字典键中的空格
- excel - 获取所有组合,其中第一项的顺序很重要,但其余的顺序不重要
- embedded - 任务和优化编译器之间的区别
- c++ - 从 SDL 库中的函数返回的指针
- reactjs - React JSX 如何将父自定义反应组件状态属性值传递给子客户组件?
- r - 如何在 ggplot2 R 折线图中获得插值