【问题标题】:Does HSQLDB support setArray for in predicates in queries?HSQLDB 是否支持 setArray 用于查询中的谓词?
【发布时间】:2020-07-24 12:51:46
【问题描述】:

假设您想通过 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();

但是,cmets 表明并非所有 JDBC 驱动程序都支持这一点。 HSQLDB docssetArray() 从 2.0 版开始受支持,但我不清楚这是否意味着上面的示例可以工作,特别是使用带有 in 谓词的这个构造。任何人都可以对此有所了解吗?

【问题讨论】:

    标签: jdbc hsqldb


    【解决方案1】:

    直接从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();
    

    【讨论】:

    • 你指的是hsqldb.org/doc/2.0/guide/sqlgeneral-chapt.html#sgc_array_def(注意章节)?我已经更新了我的问题以进行澄清:我想知道这在用于 in 谓词 (lastname IN ('Stauder', 'Brugger', 'Wieser')) 时是否有效。
    • 正确的例子需要参考这部分hsqldb.org/doc/2.0/guide/…(IN Predicate)。需要 IN ( UNNEST(?) )。
    • @fredt 这正是我的意思,为什么不把它作为答案让我接受呢?
    • 最后一个需要澄清的问题:我真的需要使用这些 HSQLDB 特定的类型吗?或者将缺少的UNNEST(?) 添加到我的问题中的代码中就足够了吗?
    • 完成了我的代码并试了一下:显然只需要UNNEST(?),其余的按照我的问题中的说明工作。
    猜你喜欢
    • 2010-11-28
    • 2016-01-26
    • 2021-11-16
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多