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

sti*_*ure 5 postgresql json jooq

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

我想写jOOQ等效于:

SELECT * FROM sometable WHERE somecolumn ?| <mylist>

...应绑定到字符串标记名称的Java列表。

似乎没有直接支持?|。在jOOQ 3.8中。我已经看过在某种情况下绑定到原始sql了,但是我不太确定其语法。如果尝试使用?与绑定表达式冲突的postgres运算符,则情况甚至更糟。

更新:3.8.3中的stacktrace

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

query.addConditions(DSL.condition("sometable.tags ?| array['sometag']"));
Run Code Online (Sandbox Code Playgroud)

产生如下的堆栈跟踪:

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
Run Code Online (Sandbox Code Playgroud)

Luk*_*der 3

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

JDBC 限制

请注意,除了上述之外,还有一个 JDBC 限制,我已在单独的问题中记录了这一点。在 jOOQ 中,您可以通过指定以下方式解决此 JDBC 限制:

Settings settings = new Settings().withStatementType(StatementType.STATIC_STATEMENT);
Run Code Online (Sandbox Code Playgroud)

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

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