Как использовать операторы Postgres JSON в условии WHERE с jOOQ?

У меня есть столбец JSONB, содержащий массивы строк, например: ["foo", "bar"]

Я хочу написать эквивалент jOOQ:

SELECT * FROM sometable WHERE somecolumn ?| <mylist>

... где должен быть привязан к 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

person stickfigure    schedule 12.07.2016    source источник


Ответы (1)


Проблема, связанная с синтаксическим анализом jOOQ ?| и аналогичными операторами в качестве переменных связывания, была решена в jOOQ 3.8.3: https://github.com/jOOQ/jOOQ/issues/5307

Ограничение JDBC

Обратите внимание: в дополнение к вышесказанному существует также ограничение JDBC, которое я задокументировал в отдельном вопросе. В jOOQ вы можете обойти это ограничение JDBC, указав:

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

См. Также: http://www.jooq.org/doc/latest/manual/sql-execution/statement-type

Или, в качестве альтернативы, вернувшись к использованию функции jsonb_exists_any() вместо оператора ?|.

person Lukas Eder    schedule 13.07.2016
comment
Спасибо - однако, похоже, это не работает с 3.8.3. Может, потому что я использую SelectQuery.addCondition()? Кажется, что-то передает переменную связывания драйверу postgres. Я обновил вопрос, добавив соответствующее сообщение об ошибке и трассировку стека. - person stickfigure; 14.07.2016
comment
Спасибо за подсказку. Я действительно только исправил парсер jOOQ, чтобы не вставлять какие-либо переменные связывания в неправильные позиции. Также существует ошибка / ограничение JDBC, о которой я задокументировал в отдельном вопросе - person Lukas Eder; 14.07.2016