Jdbi: Escapando do operador de ponto de interrogação jsonb no postgres

Criado em 18 set. 2015  ·  6Comentários  ·  Fonte: jdbi/jdbi

Estou tentando usar jdbi com postgres e jsonb para escrever uma consulta como esta:

select id, data from some_table where data ? :key

Infelizmente, o jdbi interpreta esse ponto de interrogação como um espaço reservado para uma variável. Como posso escapar do ponto de interrogação para usar o operador de ponto de interrogação do postgres?

Comentários muito úteis

Acontece que este é um problema de upstream no jdbc. Eles implementaram uma maneira de escapar disso. Você tem que usar ??. Igual a:

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

Todos 6 comentários

Você já tentou a barra invertida \? ?

Sim, acho que deveria ter mencionado isso. Esse foi meu primeiro instinto. Mas ainda recebo um erro.

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

Acontece que este é um problema de upstream no jdbc. Eles implementaram uma maneira de escapar disso. Você tem que usar ??. Igual a:

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

Consulta Postgres
SELECT json_data FROM employee where json_data -> 'employee' @> '{"name":"Aman"}'

A consulta acima funciona bem quando executada no postgres. Mas quando executado com jdbctemplate, ele gera um erro.

Código Java

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

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

Ao encontrar a última linha do código, ele lança um erro: - O índice da coluna está fora do intervalo: 1, número de colunas: 0 .; a exceção aninhada é org.postgresql.util.PSQLException.

Não é capaz de substituir o '?' placeholder.

Isso está de acordo com a especificação JDBC. Marcadores ? não são reconhecidos como parâmetros dentro de literais de string.

Se você precisar interpolar um parâmetro nessa string JSON, use concatenação. Usando a sintaxe de concatenação do Postgres, a consulta ficaria assim:

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

Observe também que este é o projeto Jdbi, não JdbcTemplate. :)

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

mcarabolante picture mcarabolante  ·  4Comentários

kkrgwbj picture kkrgwbj  ·  4Comentários

qualidafial picture qualidafial  ·  3Comentários

Shujito picture Shujito  ·  5Comentários

goxr3plus picture goxr3plus  ·  4Comentários