将java.sql.Array创建为整数数组,以便在预准备语句中使用

时间:2017-07-21 18:22:23

标签: java arrays jdbc

我需要使用预准备语句在我的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查询?

1 个答案:

答案 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());
    }
}