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; //---
条件将是您要检索字段的项目列表。