Java JDBC:在设置条件中:我可以将设置作为单个参数传递吗?
在JDBC中,我可以对查询参数使用问号,如下所示:Java JDBC:在设置条件中:我可以将设置作为单个参数传递吗?,java,sql,jdbc,Java,Sql,Jdbc,在JDBC中,我可以对查询参数使用问号,如下所示: "SELECT * FROM users WHERE login = ?" 然后 ps.setString(1, "vasya"); 但如何查询登录列表: "SELECT * FROM users WHERE login IN ?" 假设我有 List<String> logins = ... 我可以将查询重写为: "SELECT * FROM users WHERE login = ? OR login = ? OR lo
"SELECT * FROM users WHERE login = ?"
然后
ps.setString(1, "vasya");
但如何查询登录列表:
"SELECT * FROM users WHERE login IN ?"
假设我有
List<String> logins = ...
我可以将查询重写为:
"SELECT * FROM users WHERE login = ? OR login = ? OR login = ?"
然后在循环中调用setString,但我想知道是否可以在查询中将一组元素作为单个参数传递
可能存在特定于供应商的扩展?查看可用选项的概述。据我所知,每个人都在通过一些优化动态生成必要数量的占位符字符
PreparedStatement中有一个setArray方法,但有时使用它是不可行的。你可以试试看
如果Spring的JDBCTemplate是一个选项,那么可以使用所述的自动集合扩展
条件将是您要检索字段的项目列表。有特定于供应商的方法,因此最好了解您使用的数据库。我知道PostgreSQL和H2的解决方案。我在H2数据库中实现了此功能,因此我最了解的是: H2数据库 PostgreSQL
然后使用PreparedStatement.setArray.将参数设置为值数组。。不是针对H2设置对象。编辑了我的答案,可能会对您有所帮助。这只是在循环中发送查询。如果集合相当大,那么与使用生成的查询相比,这应该是非常低效的。没有理由不能使用Spring实现这一点,而且应该这样做,因为您可以免费获得真正的异常层次结构。
"SELECT * FROM users WHERE login = ? OR login = ? OR login = ?"
//---
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;
//---
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();
WHERE login = ANY(?)