Es gibt zwei mögliche Problemumgehungen:
Verwenden Sie statische Anweisungen statt vorbereiteter Anweisungen
Dies ist die einfachste Problemumgehung, aber Sie verlieren alle Vorteile vorbereiteter Anweisungen (Leistung, SQL-Injection-Schutz usw.). Dies wird jedoch funktionieren
try (Statement s = c.createStatement();
ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
...
}
Vermeiden Sie den Bediener. Verwenden Sie stattdessen eine Funktion (Hinweis:Indizes werden möglicherweise nicht verwendet)
Operatoren sind nur Syntaxzucker für eine Hilfsfunktion, die in pg_catalog
existiert . So finden Sie den Namen dieser Funktionen:
SELECT
oprname,
oprcode || '(' || format_type(oprleft, NULL::integer) || ', '
|| format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator
WHERE oprname = '?|';
Die obigen Ergebnisse:
oprname function
----------------------------------------------------------------------------------
?| point_vert(point, point)
?| lseg_vertical(-, lseg)
?| line_vertical(-, line)
?| jsonb_exists_any(jsonb, text[]) <--- this is the one we're looking for
?| exists_any(hstore, text[])
Die einfachste Problemumgehung besteht also darin, einfach nicht den Operator zu verwenden, sondern stattdessen die entsprechende Funktion:
try (PreparedStatement s = c.prepareStatement(
"select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
ResultSet rs = s.executeQuery()) {
...
}