JDBC:在set条件下:我可以将一个set作为单个param传递吗?

时间:2010-09-16 05:01:53

标签: java sql jdbc

在JDBC中,我可以对查询参数使用问号,如下所示:

"SELECT * FROM users WHERE login = ?"

然后

ps.setString(1, "vasya");

但是如何查询登录列表:

"SELECT * FROM users WHERE login IN ?"

假设,我有

List<String> logins = ...

我应该在那里输入什么:

ps.setWhat(1, what);

我可以将查询重写为:

"SELECT * FROM users WHERE login = ? OR login = ? OR login = ?"

然后在循环中调用setString,但我想知道是否可以在查询中将一组元素作为单个参数传递。

也许有特定于供应商的扩展程序?

3 个答案:

答案 0 :(得分:4)

有供应商特定的方法可以做到这一点,因此了解您使用的数据库会很好。我知道PostgreSQL和H2的解决方案。我在H2数据库中实现了这个功能,所以这就是我最熟悉的:

H2数据库

PreparedStatement prep = conn.prepareStatement(
  "select * from users where login in (select * from table(x int = ?))");
prep.setObject(1, new Object[] { "1", "2" });
ResultSet rs = prep.executeQuery();

<强>的PostgreSQL

WHERE login = ANY(?)

然后使用PreparedStatement.setArray(..)将参数设置为值数组(不像H2那样设置setObject)。

答案 1 :(得分:3)

查看here以获取可用选项的概述。据我所知,每个人都动态生成必要数量的占位符(通过一些优化)。

setArray中有一个PreparedStatement方法,但有时使用它是不可行的。你可以尝试一下。

如果Spring的JDBCTemplate是一个选项,您可以使用here所述的自动集合扩展。

答案 2 :(得分:0)

//---

String query = "SELECT * FROM users WHERE login = ?";    

List<Login> list = new ArrayList<Login>();      
Login login = null;

for(String param : conditions){

    pStmt.setString(1,param);

    rSet = pStmt.executeQuery();    

            if(rSet.next()){

                login = new Login();
                login.setName(rSet.getString(1));

                list.add(login);
            }
}

return list;

//---

条件将是您要检索字段的项目列表。