Heim > Datenbank > MySQL-Tutorial > So verwenden Sie PostgreSQL-JSONB-Operatoren mit Fragezeichen „?' in JDBC?

So verwenden Sie PostgreSQL-JSONB-Operatoren mit Fragezeichen „?' in JDBC?

Barbara Streisand
Freigeben: 2024-12-30 02:47:28
Original
197 Leute haben es durchsucht

How to Use PostgreSQL JSONB Operators with Question Marks

So verwenden Sie den PostgreSQL-JSON(B)-Operator mit Fragezeichen „?“ in JDBC

PostgreSQL bietet mehrere Methoden, die Fragezeichen verwenden als Namen Teil der cleveren ASCII-Operatoren, wie z. B. diese JSON Operatoren:

  • ?: Existiert eine Zeichenfolge als Schlüssel der obersten Ebene in einem JSON-Wert?
  • ?|: Existiert einer dieser Array-Strings als Schlüssel der obersten Ebene?
  • ?&: Existieren diese Array-Strings als Schlüssel der obersten Ebene?

Das Problem besteht darin, dass der offizielle PostgreSQL-JDBC-Treiber anscheinend nicht in der Lage ist, SQL-Strings, die solche Operatoren enthalten, korrekt zu analysieren. Das Fragezeichen wird als gewöhnliche JDBC-Bindungsvariable betrachtet. Der folgende Code...

try (
    PreparedStatement s = c.prepareStatement("select '{}'::jsonb ?| array['a', 'b']");
    ResultSet rs = s.executeQuery()) {
    ...
}
Nach dem Login kopieren

... löst eine Ausnahme aus:

org.postgresql.util.PSQLException: Für den Parameter 1 wurde kein Wert angegeben.
    at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:225)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:190)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:424)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:161)
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114)
Nach dem Login kopieren

Wie verwende ich diesen Operator?

Es gibt zwei mögliche Lösungen:

1. Verwenden Sie statische Anweisungen anstelle von vorbereiteten Anweisungen

Dies ist die einfachste Problemumgehung, aber Sie alle Vorteile vorbereiteter Anweisungen (Leistung, SQL-Injection-Schutz usw.) verlieren. Dies funktioniert jedoch:

try (
    Statement s = c.createStatement();
    ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
    ...
}
Nach dem Login kopieren

2. Vermeiden Sie die Verwendung von Operatoren. Verwenden Sie stattdessen eine Funktion (Hinweis: Die Indizierung darf nicht verwendet werden). Der Operator

ist lediglich syntaktischer Zucker für die unterstützte Funktion, die in pg_catalog vorhanden ist. So finden Sie die Namen dieser Funktionen:

SELECT 
  oprname, 
  oprcode || '(' || format_type(oprleft,  NULL::integer) || ', ' 
                 || format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator 
WHERE oprname = '?|';
Nach dem Login kopieren

Die obige Operation ergibt:

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[])
Nach dem Login kopieren

Die einfachste Lösung besteht also darin, nicht den Operator, sondern die entsprechende Funktion zu verwenden:

try (
    PreparedStatement s = c.prepareStatement("select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
    ResultSet rs = s.executeQuery()) {
    ...
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo verwenden Sie PostgreSQL-JSONB-Operatoren mit Fragezeichen „?' in JDBC?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage