Jdbi: Den jsonb-Fragezeichenoperator in Postgres umgehen

Erstellt am 18. Sept. 2015  ·  6Kommentare  ·  Quelle: jdbi/jdbi

Ich versuche, jdbi mit postgres und jsonb zu verwenden, um eine Abfrage wie diese zu schreiben:

select id, data from some_table where data ? :key

Leider interpretiert jdbi dieses Fragezeichen als Platzhalter für eine Variable. Wie kann ich das Fragezeichen umgehen, damit ich den Postgres-Fragezeichenoperator verwenden kann?

Hilfreichster Kommentar

Es stellte sich heraus, dass dies ein Upstream-Problem in jdbc ist. Sie haben einen Weg implementiert, um ihm zu entkommen. Sie müssen ???. Wie so:

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

Alle 6 Kommentare

Haben Sie den umgekehrten Schrägstrich \? ausprobiert?

Ja, das hätte ich wohl erwähnen sollen. Das war mein erster Instinkt. Aber ich bekomme immer noch einen Fehler.

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

Es stellte sich heraus, dass dies ein Upstream-Problem in jdbc ist. Sie haben einen Weg implementiert, um ihm zu entkommen. Sie müssen ???. Wie so:

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

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

Die obige Abfrage funktioniert gut, wenn sie in Postgres ausgeführt wird. Aber wenn es mit jdbctemplate ausgeführt wird, wird ein Fehler ausgegeben.

Java-Code

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

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

Bei der letzten Zeile des Codes wird ein Fehler ausgegeben: - Der Spaltenindex ist außerhalb des zulässigen Bereichs: 1, Anzahl der Spalten: 0.; verschachtelte Ausnahme ist org.postgresql.util.PSQLException.

Es ist nicht in der Lage, das '?' Platzhalter.

Das entspricht der JDBC-Spezifikation. ? Marker werden nicht als Parameter innerhalb von String-Literalen erkannt.

Wenn Sie einen Parameter in diesen JSON-String interpolieren müssen, verwenden Sie die Verkettung. Unter Verwendung der Postgres-Verkettungssyntax würde die Abfrage wie folgt aussehen:

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

Bitte beachten Sie auch, dass dies das Jdbi-Projekt ist, nicht JdbcTemplate. :)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen