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