Jdbi: Экранирование оператора вопросительного знака jsonb в postgres

Созданный на 18 сент. 2015  ·  6Комментарии  ·  Источник: jdbi/jdbi

Я пытаюсь использовать jdbi с postgres и jsonb, чтобы написать такой запрос:

select id, data from some_table where data ? :key

К сожалению, jdbi интерпретирует этот вопросительный знак как заполнитель для переменной. Как избежать знака вопроса и использовать оператор знака вопроса postgres?

Самый полезный комментарий

Оказывается, это проблема апстрима в jdbc. Они реализовали способ избежать этого. Вы должны использовать ??. Вот так:

select id, data from some_table where data ?? :key

Все 6 Комментарий

Вы пробовали использовать обратную косую черту \? ?

Да, думаю, мне следовало упомянуть об этом. Это был мой первый инстинкт. Но я все равно получаю ошибку.

Exception in thread "main" org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: org.postgresql.util.PSQLException: No value specified for parameter 2. [statement:"select id, createdDate, data from something where data \? ?", located:"select id, createdDate, data from something where data \? ?", rewritten:"select id, createdDate, data from something where data ? ?", arguments:{ positional:{0:'pattern'}, named:{}, finder:[]}]
    at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1334)
    at org.skife.jdbi.v2.Query.fold(Query.java:173)
    at org.skife.jdbi.v2.Query.list(Query.java:82)
    at org.skife.jdbi.v2.Query.list(Query.java:75)
    at com.ngc.vault.eventer.Query.hasKey(Query.java:45)
    at com.ngc.vault.eventer.Main.main(Main.java:34)
Caused by: org.postgresql.util.PSQLException: No value specified for parameter 2.
    at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:228)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:163)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:615)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:465)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:458)
    at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1328)
    ... 5 more

Оказывается, это проблема апстрима в jdbc. Они реализовали способ избежать этого. Вы должны использовать ??. Вот так:

select id, data from some_table where data ?? :key

Запрос Postgres
SELECT json_data FROM employee where json_data -> 'employee' @> '{"name":"Aman"}'

Вышеупомянутый запрос отлично работает при запуске в postgres. Но при запуске с jdbctemplate выдает ошибку.

Код Java

String sql="SELECT json_data FROM employee where json_data -> 'employee' @> '{\"name\":\"?\"}'";

List<Map<String, Object>> emp = jdbcTemplate.queryForList(sql,param);

При встрече с последней строкой кода выдается ошибка: - Индекс столбца вне допустимого диапазона: 1, количество столбцов: 0 .; вложенное исключение - org.postgresql.util.PSQLException.

Он не может заменить "?" заполнитель.

Это согласно спецификации JDBC. Маркеры ? не распознаются как параметры внутри строковых литералов.

Если вам нужно интерполировать параметр в эту строку JSON, используйте конкатенацию. Используя синтаксис конкатенации Postgres, запрос будет выглядеть так:

SELECT json_data
FROM employee
WHERE json_data -> 'employee' @> ('{"name": "' || ? || '"}')

Также обратите внимание, что это проект Jdbi, а не JdbcTemplate. :)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги