HSQLDB 是否支持查询中的 in 谓词的 setArray?
Does HSQLDB support setArray for in predicates in queries?
假设您想通过 JDBC 连接向 HSQLDB 实例发出如下查询:
select * from employees where lastname in ('Stauder', 'Brugger', 'Wieser');
挑战:名称列表各不相同(值的数量以及值本身),我们想使用 PreparedStatement
.
根据 this answer,正确的方法是:
PreparedStatement statement = connection.prepareStatement(
"select * from employees where lastname in (?)");
/* modify the following line to determine the values dynamically */
Array array = statement.getConnection().createArrayOf("VARCHAR",
new Object[]{"Stauder", "Brugger", "Wieser"});
statement.setArray(1, array);
ResultSet rs = statement.executeQuery();
然而,评论表明并非所有 JDBC 驱动程序都支持此功能。 HSQLDB docs 说从 2.0 版开始支持 setArray()
,但我不清楚这是否意味着上面的示例可以工作,特别是将此构造与 in 谓词一起使用。任何人都可以阐明这一点吗?
直接取自HSQLDB Documentation,这就是你应该做的。 (@fredt 的主要支持,因为他实际上有完整的正确答案)。
String sql = "select * from employees where lastname in ( UNNEST(?) )";
PreparedStatement ps = connection.prepareStatement(sql)
Object[] data = new Object[]{"Stauder", "Brugger", "Wieser"};
// default types defined in org.hsqldb.types.Type can be used
org.hsqldb.types.Type type = org.hsqldb.types.Type.SQL_VARCHAR_DEFAULT;
JDBCArrayBasic array = new JDBCArrayBasic(data, type);
ps.setArray(1, array);
ResultSet rs = ps.executeQuery();
假设您想通过 JDBC 连接向 HSQLDB 实例发出如下查询:
select * from employees where lastname in ('Stauder', 'Brugger', 'Wieser');
挑战:名称列表各不相同(值的数量以及值本身),我们想使用 PreparedStatement
.
根据 this answer,正确的方法是:
PreparedStatement statement = connection.prepareStatement(
"select * from employees where lastname in (?)");
/* modify the following line to determine the values dynamically */
Array array = statement.getConnection().createArrayOf("VARCHAR",
new Object[]{"Stauder", "Brugger", "Wieser"});
statement.setArray(1, array);
ResultSet rs = statement.executeQuery();
然而,评论表明并非所有 JDBC 驱动程序都支持此功能。 HSQLDB docs 说从 2.0 版开始支持 setArray()
,但我不清楚这是否意味着上面的示例可以工作,特别是将此构造与 in 谓词一起使用。任何人都可以阐明这一点吗?
直接取自HSQLDB Documentation,这就是你应该做的。 (@fredt 的主要支持,因为他实际上有完整的正确答案)。
String sql = "select * from employees where lastname in ( UNNEST(?) )";
PreparedStatement ps = connection.prepareStatement(sql)
Object[] data = new Object[]{"Stauder", "Brugger", "Wieser"};
// default types defined in org.hsqldb.types.Type can be used
org.hsqldb.types.Type type = org.hsqldb.types.Type.SQL_VARCHAR_DEFAULT;
JDBCArrayBasic array = new JDBCArrayBasic(data, type);
ps.setArray(1, array);
ResultSet rs = ps.executeQuery();