JDBC で疑問符「?」を含む PostgreSQL JSON(B) 演算子を使用する方法
PostgreSQL には疑問符を使用するメソッドがいくつかあります名前としてこれらの JSON などの賢い ASCII 演算子の一部演算子:
問題は、公式の PostgreSQL JDBC ドライバーがそのような演算子を含む SQL 文字列を正しく解析できないように見えることです。疑問符は通常の JDBC バインド変数であると見なされます。次のコード...
try ( PreparedStatement s = c.prepareStatement("select '{}'::jsonb ?| array['a', 'b']"); ResultSet rs = s.executeQuery()) { ... }
... は例外をスローします:
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)
この演算子の使用方法?
考えられる解決策は 2 つあります。
1. 準備済みステートメントの代わりに静的ステートメントを使用します。
これは最も簡単な回避策ですが、プリペアド ステートメントの利点 (パフォーマンス、SQL インジェクション保護など) がすべて失われます。ただし、これは機能します:
try ( Statement s = c.createStatement(); ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) { ... }
2. 演算子の使用は避けてください。代わりに関数を使用してください (注: インデックスは使用できない場合があります)
演算子は、pg_catalog に存在する、サポートされている関数の糖衣構文にすぎません。これらの関数の名前を見つける方法は次のとおりです:
SELECT oprname, oprcode || '(' || format_type(oprleft, NULL::integer) || ', ' || format_type(oprright, NULL::integer) || ')' AS function FROM pg_operator WHERE oprname = '?|';
上記の演算により次の結果が生成されます:
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[])
したがって、最も簡単な解決策は、演算子を使用するのではなく、対応する関数を使用することです:
try ( PreparedStatement s = c.prepareStatement("select jsonb_exists_any('{}'::jsonb, array['a', 'b']"); ResultSet rs = s.executeQuery()) { ... }
以上が疑問符「?」を含む PostgreSQL JSONB 演算子を使用する方法JDBCでは?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。