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
Barbara StreisandOriginal
2024-12-30 02:47:28210Durchsuche

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

... 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)

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']")) {
    ...
}

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 = '?|';

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[])

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

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!

Stellungnahme:
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