Wir haben eine Legacy-Datenbankspalte vom Typ jsonb, die sowohl Array als auch JSON speichern kann. ZB.
Code: Select all
items
-------
["elem1","elem2"]
["elem3","elem4"]
{"elem31": ["src1", "src2", "src3"], "elem100": ["src5"]}
{"elem21": ["src1", "src2"]}
Um nun nach einer bestimmten Zeile zu suchen, die ein beliebiges Element enthält, verwende ich diese Abfrage:
Code: Select all
select * from tbl1 where item ? 'elem21' // if searching for single element
select * from tbl1 where item ?| '{elem21,elem1}' // if any rows matches any of item in list element.
Die oben genannten Abfragen laufen einwandfrei in der psql-Konsole.
Wie führe ich die obige Abfrage in der nativen Spring Boot-Abfrage aus?
Die Abfrage schreiben als
Code: Select all
@Query("select * from tbl1 where item ? :elem ", nativeQuery=true)
List findBySingleElement(@Param("elem") String element)
@Query("select * from tbl1 where item ?| (:elems)", nativeQuery=true)
List findByAnyElement(@Param("elems") String[] elements)
// -------positional example----
@Query("select * from tbl1 where item ? ?1", nativeQuery=true)
List findBySingleElement(String element)
@Query("select * from tbl1 where item ?| (?1)", nativeQuery=true)
List findByAnyElement(String[] elements)
Dies wird nicht kompiliert und gibt einen Fehler aus:
Wir sollten nicht übereinstimmen? und parametrisierte Anmerkungen.
Code: Select all
java.lang.IllegalArgumentException: Mixing of ? parameters and other forms like ?1 is not supported
Die Verwendung von ?1 anstelle von :elem führt zu einer Ausnahme wegen fehlender Parameter.
So entkommen Sie ? wenn ? im Komparatoroperator steht (Ich habe auch ??| und \\?| ausprobiert, aber diese funktionieren nicht.) Oder gibt es eine Möglichkeit, diese zu schreiben Art von Fragen, die mir fehlen.
PS. Ab sofort habe ich durch Datenbankmigrationen eine benutzerdefinierte psql-Funktion erstellt und verwende sie direkt.
Wir haben eine Legacy-Datenbankspalte vom Typ jsonb, die sowohl Array als auch JSON speichern kann. ZB.
[code]items
-------
["elem1","elem2"]
["elem3","elem4"]
{"elem31": ["src1", "src2", "src3"], "elem100": ["src5"]}
{"elem21": ["src1", "src2"]}
[/code]
Um nun nach einer bestimmten Zeile zu suchen, die ein beliebiges Element enthält, verwende ich diese Abfrage:
[code]select * from tbl1 where item ? 'elem21' // if searching for single element
select * from tbl1 where item ?| '{elem21,elem1}' // if any rows matches any of item in list element.
[/code]
Die oben genannten Abfragen laufen einwandfrei in der psql-Konsole.
Wie führe ich die obige Abfrage in der nativen Spring Boot-Abfrage aus?
Die Abfrage schreiben als
[code]@Query("select * from tbl1 where item ? :elem ", nativeQuery=true)
List findBySingleElement(@Param("elem") String element)
@Query("select * from tbl1 where item ?| (:elems)", nativeQuery=true)
List findByAnyElement(@Param("elems") String[] elements)
// -------positional example----
@Query("select * from tbl1 where item ? ?1", nativeQuery=true)
List findBySingleElement(String element)
@Query("select * from tbl1 where item ?| (?1)", nativeQuery=true)
List findByAnyElement(String[] elements)
[/code]
Dies wird nicht kompiliert und gibt einen Fehler aus:
Wir sollten nicht übereinstimmen? und parametrisierte Anmerkungen.
[code]java.lang.IllegalArgumentException: Mixing of ? parameters and other forms like ?1 is not supported[/code]
Die Verwendung von ?1 anstelle von :elem führt zu einer Ausnahme wegen fehlender Parameter.
So entkommen Sie ? wenn ? im Komparatoroperator steht (Ich habe auch ??| und \\?| ausprobiert, aber diese funktionieren nicht.) Oder gibt es eine Möglichkeit, diese zu schreiben Art von Fragen, die mir fehlen.
PS. Ab sofort habe ich durch Datenbankmigrationen eine benutzerdefinierte psql-Funktion erstellt und verwende sie direkt.