Ich habe ein Problem, diese native Abfrage richtig gegen eine Postgres 9.4-Instanz zu bekommen.Wie verwende ich Springdaten jpa, um die jsonb-Spalte abzufragen?
Mein Repository hat eine Methode:
@Query(value = "SELECT t.* " +
"FROM my_table t " +
"WHERE t.field_1 = ?1 " +
"AND t.field_2 = 1 " +
"AND t.field_3 IN ?2 " +
"AND t.jsonb_field #>> '{key,subkey}' = ?3",
nativeQuery = true)
List<Entity> getEntities(String field1Value,
Collection<Integer> field3Values,
String jsonbFieldValue);
Aber die Protokolle zeigen dies:
SELECT t.* FROM my_table t
WHERE t.field_1 = ?1
AND t.field_2 = 1
AND t.field_3 IN ?2
AND t.jsonb_field ? '{key,subkey}' = ?3
Und ich bekomme diese Ausnahme:
Interne Ausnahme: org.postgresql.util .PSQLException: Kein Wert für Parameter 2 angegeben.
Ich protokollierte die Parameter direkt vor Methodenaufruf, und sie werden alle geliefert.
Ich bin mir nicht sicher, warum #>>
?
im Protokoll zeigt. Muss ich entkommen #>>
? Muss ich die Sammlung für IN
formatieren? Muss ich dem Json-Pfad entkommen?
Wenn ich die Abfrage direkt gegen die db ausführen, funktioniert es. Beispiel:
SELECT *
FROM my_table t
WHERE t.field_1 = 'xxxx'
AND t.field_2 = 1
AND t.field_3 IN (13)
AND t.jsonb_field #>> '{key,subkey}' = 'value'
denke ich, ich bin immer näher. Anscheinend sind IN-Klauseln für Listenparameter bei nativen Abfragen nicht zulässig. Ist es möglich, jsonb-Operationen mit jpa/jpql ohne native Abfrage auszuführen? –
Huh? Sie arbeiten mit systemeigenen Abfragen in Hibernate. Verwenden Sie EclipseLink oder eine der weniger populären Implementierungen? Wie auch immer, in Postgres wird der Ausdruck 'Feld IN (val1, val2)' in sein Äquivalent 'field = ANY ('{val1, val1}')' transformiert. Wenn Sie es als ein Array zu "Feld = ANY (?)" Mit den Klammern übergeben, funktioniert es genauso. Das Äquivalent für "NOT IN" ist "Feld <> ALL (?)". Dies zwingt Sie natürlich dazu, die Zeichenfolgendarstellung des Arrays selbst zu erstellen und sicherzustellen, dass Sie alle Strings ordnungsgemäß entkoppelt werden. – coladict
Ja, wir verwenden Eclipselink. Ich bin mir nicht sicher, warum das gegenüber Hibernate vorzuziehen ist. Was würden Sie empfehlen? In jedem Fall, nachdem ich zu 'jsonb_extract_path_text' gewechselt habe, ist die Abfrage mit einer neuen Ausnahme fehlgeschlagen. Als ich nach der Ausnahme gegoogelt habe, habe ich http://stackoverflow.com/a/6279110/918608 und http://stackoverflow.com/a/41564377/918608 gefunden. Es scheint, dass ich eine konstante Anzahl von Werten in meiner Liste haben muss, und ich muss sie in meiner nativen Abfrage aufzählen. Ist das nicht der Fall? –