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?
¿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. :)
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: