jdbc - HSQLDB 是否支持 setArray 用于查询中的谓词?
问题描述
假设您想通过 JDBC 连接向 HSQLDB 实例发出如下查询:
select * from employees where lastname in ('Stauder', 'Brugger', 'Wieser');
挑战:名称列表各不相同(值的数量以及值本身),我们想使用PreparedStatement
.
根据这个答案,正确的方法是:
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文档说setArray()
从 2.0 版开始支持,但我不清楚这是否意味着上面的示例可以工作,特别是使用这个带有 in 谓词的构造。任何人都可以对此有所了解吗?
解决方案
直接从HSQLDB 文档中获取,这就是你应该这样做的方式。(@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();
推荐阅读
- mysql - 为什么sql中的这个表连接类型是ALL?
- node.js - 如何使用 jest 在课堂上测试功能
- c++ - 为什么在 C++ 中互斥锁的使用是正确的?
- javascript - 比较两个数组,如果 id 相等则禁用元素
- python - 如何使用 Flask 应用程序工厂模式实现 Celery
- python - pandas.groupby 使用具有分类类型与对象的 lambda aggfunc 对相同数据做出不同反应
- html - 调整椭圆内容的宽度
- ansible - Ansible 主机组和过滤 IP 的问题
- cryptography - 使用“exponent”、“modulus”和“maxdigits”在“node-forge”中生成密钥对
- installshield - 启动程序默认启用 Installshield