Java 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

在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 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(?)