我需要使用预准备语句在我的SQL语句中使用整数数组。
当我尝试创建数组时,以及当我读取Javadoc it says时它只显示字符串数组的创建。我必须在一次调用中搜索大量的表键id(之前一次迭代它们导致22k查询)所以我需要一次所有的结果。
我的查询字符串看起来像这样
AND A.KEY in (?) order by KEYID DESC
这是我构建查询的地方(通过使用带有我的ID列表的java.sql.Array)
StringBuilder query = new StringBuilder(Query);
PreparedStatement stmt = connection.prepareStatement(query.toString());
java.sql.Array array = connection.createArrayOf("varchar", Ids.toArray());
stmt.setArray( 1, array);
ResultSet results = stmt.executeQuery();
我尝试将它们作为字符串运行,因为sql.Array使用字符串,但我需要将它们作为int发送。
我的ID以ArrayList<Integer>
的形式出现,这就是为什么这不是一个重复的问题的关键,我需要向sql语句发送一个整数列表 - 我的方式适用于字符串。
编辑,当我通过我的程序一次发送一个int时,它运行正常。
如何解决此问题以发送带有整数的SQL语句来代替我?在sql查询?
答案 0 :(得分:0)
所以我想出了解决这个问题的方法。我没有将整个列表作为参数发送到我的set语句,而是动态地添加了&#39;,?&#39;以满足我有多少输入。
然后我动态地将我的arraylist中的每个项目添加到下一个位置(?)的set语句中。
这不如向其投掷列表那么高效,但至少我只对我的数据库进行1次调用。
if (Ids.size()==1){
stmt.setInt( 1, Ids.get(0).intValue());
}
if (Ids.size() > 1){
int temp = Ids.size();
while (temp >1){
query.insert(Query.indexOf("?") + 1, ", ?");
temp-=1;
}
stmt = connection.prepareStatement(query.toString());
for (int i=1 ; i<=Ids.size(); i++){
stmt.setInt( i, Ids.get(i-1).intValue());
}
}