Jdbi: Escapar del operador de signo de interrogación jsonb en postgres

Creado en 18 sept. 2015  ·  6Comentarios  ·  Fuente: jdbi/jdbi

Estoy tratando de usar jdbi con postgres y jsonb para escribir una consulta como esta:

select id, data from some_table where data ? :key

Desafortunadamente, jdbi interpreta este signo de interrogación como un marcador de posición para una variable. ¿Cómo puedo escapar del signo de interrogación para poder usar el operador de signo de interrogación de Postgres?

Comentario más útil

Resulta que este es un problema anterior en jdbc. Han implementado una forma de escapar de ella. Tienes que usar ??. Al igual que:

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

Todos 6 comentarios

¿Has probado la barra invertida \? ?

Sí, supongo que debería haberlo mencionado. Ese fue mi primer instinto. Pero sigo recibiendo un error.

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

Resulta que este es un problema anterior en jdbc. Han implementado una forma de escapar de ella. Tienes que usar ??. Al igual que:

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

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

La consulta anterior funciona bien cuando se ejecuta en postgres. Pero cuando se ejecuta con jdbctemplate, arroja un error.

Código Java

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

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

Al encontrar la última línea del código, arroja un error: - El índice de la columna está fuera de rango: 1, número de columnas: 0 .; La excepción anidada es org.postgresql.util.PSQLException.

No puede sustituir el '?' marcador de posición.

Eso es de acuerdo con la especificación JDBC. ? marcadores

Si necesita interpolar un parámetro en esa cadena JSON, use la concatenación. Usando la sintaxis de concatenación de Postgres, la consulta se vería así:

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

Tenga en cuenta también que este es el proyecto Jdbi, no JdbcTemplate. :)

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

goxr3plus picture goxr3plus  ·  4Comentarios

anjeyy picture anjeyy  ·  3Comentarios

rherrmann picture rherrmann  ·  4Comentarios

jarlah picture jarlah  ·  3Comentarios

buremba picture buremba  ·  5Comentarios