JDBC:在设置条件下:我可以将一组作为单个参数传递吗?

ste*_*heg 4 java sql jdbc

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

"SELECT * FROM users WHERE login = ?"
Run Code Online (Sandbox Code Playgroud)

进而

ps.setString(1, "vasya");
Run Code Online (Sandbox Code Playgroud)

但是我如何查询登录列表:

"SELECT * FROM users WHERE login IN ?"
Run Code Online (Sandbox Code Playgroud)

假设,我有

List<String> logins = ...
Run Code Online (Sandbox Code Playgroud)

我应该在那里输入什么:

ps.setWhat(1, what);
Run Code Online (Sandbox Code Playgroud)

我可以将查询重写为:

"SELECT * FROM users WHERE login = ? OR login = ? OR login = ?"
Run Code Online (Sandbox Code Playgroud)

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

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

Tho*_*ler 6

有供应商特定的方法可以做到这一点,因此最好了解您使用的数据库。我知道 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();
Run Code Online (Sandbox Code Playgroud)

PostgreSQL

WHERE login = ANY(?)
Run Code Online (Sandbox Code Playgroud)

然后使用PreparedStatement.setArray(..)(不是H2中的setObject)将参数设置为值数组。