如何在带有 jOOQ 的 WHERE 条件下使用 Postgres JSON 运算符?

Posted

技术标签:

【中文标题】如何在带有 jOOQ 的 WHERE 条件下使用 Postgres JSON 运算符?【英文标题】:How to use Postgres JSON operators in a WHERE condition with jOOQ? 【发布时间】:2016-11-15 08:34:06 【问题描述】:

我有一个 JSONB 列,其中包含字符串数组,例如:["foo", "bar"]

我想写 jOOQ 等价物:

SELECT * FROM sometable WHERE somecolumn ?| <mylist>

...where 应该绑定到一个 java 字符串标签名称列表。

似乎没有对 ?| 的任何直接支持。在 jOOQ 3.8 中。我已经查看了在某种条件下绑定到原始 sql,但我不太确定语法;如果尝试使用与绑定表达式冲突的 ? postgres 运算符,情况会变得更糟。

更新:3.8.3 的堆栈跟踪

我将其简化为最低限度的测试。使用 jOOQ 3.8.3 添加这样的条件时:

query.addConditions(DSL.condition("sometable.tags ?| array['sometag']"));

产生这样的堆栈跟踪:

Caused by: org.postgresql.util.PSQLException: No value specified for parameter 1.
    at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:228)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:163)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:622)
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:472)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:465)
    at org.jooq.tools.jdbc.DefaultPreparedStatement.execute(DefaultPreparedStatement.java:194)
    at org.jooq.impl.AbstractResultQuery.execute(AbstractResultQuery.java:269)
    at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:348)
    ... 36 more

【问题讨论】:

【参考方案1】:

在 jOOQ 3.8.3 中解决了与 jOOQ 解析 ?| 和类似运算符作为绑定变量相关的问题:https://github.com/jOOQ/jOOQ/issues/5307

JDBC 限制

注意,除了上述之外,还有a JDBC limitation that I have documented in a separate question。在 jOOQ 中,您可以通过指定以下内容来解决此 JDBC 限制:

Settings settings = new Settings().withStatementType(StatementType.STATIC_STATEMENT);

另见:http://www.jooq.org/doc/latest/manual/sql-execution/statement-type

或者,或者,回退到使用 jsonb_exists_any() 函数而不是 ?| 运算符。

【讨论】:

谢谢——但是,这似乎不适用于 3.8.3。也许是因为我使用的是SelectQuery.addCondition()?似乎有些东西正在将绑定变量传递给 postgres 驱动程序。我已经用相关的错误消息和堆栈跟踪更新了问题。 感谢您的提示。我确实只修复了 jOOQ 的解析器,以免在错误的位置内联任何绑定变量。还有一个 JDBC 错误/限制,I've documented in a separate question

以上是关于如何在带有 jOOQ 的 WHERE 条件下使用 Postgres JSON 运算符?的主要内容,如果未能解决你的问题,请参考以下文章

Scala:使用带有布尔方法的 jOOQ DSL

是否可以更改 jOOQ DSL 查询的 SELECT/WHERE

在 jooq 的条件表达式中使用自定义数据类型

如何使用 jOOQ 执行特定查询

jooq multiset order 结果集通过 multiset 上的条件

如何在带有jooq的普通sql中使用命名参数