PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie verwende ich PostgreSQL JSON(B)-Operatoren, die ein Fragezeichen enthalten? über JDBC

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()) {
     ...
}