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

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

"SELECT * FROM users WHERE login = ?" 

接着

 ps.setString(1, "vasya"); 

但是如何查询登录列表:

 "SELECT * FROM users WHERE login IN ?" 

假设,我有

 List logins = ... 

我应该在那里输入什么:

 ps.setWhat(1, what); 

我可以将查询重写为:

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

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

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

有供应商特定的方法,因此最好知道您使用的数据库。 我知道PostgreSQL和H2的解决方案。 我在H2数据库中实现了这个function,所以这就是我最了解的:

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)。

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

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

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

 //--- String query = "SELECT * FROM users WHERE login = ?"; List list = new ArrayList(); 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; //--- 

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