ホームページ > データベース > mysql チュートリアル > 疑問符「?」を含む PostgreSQL JSONB 演算子を使用する方法JDBCでは?

疑問符「?」を含む PostgreSQL JSONB 演算子を使用する方法JDBCでは?

Barbara Streisand
リリース: 2024-12-30 02:47:28
オリジナル
197 人が閲覧しました

How to Use PostgreSQL JSONB Operators with Question Marks

JDBC で疑問符「?」を含む PostgreSQL JSON(B) 演算子を使用する方法

PostgreSQL には疑問符を使用するメソッドがいくつかあります名前としてこれらの JSON などの賢い ASCII 演算子の一部演算子:

  • ?: JSON 値の最上位キーとして文字列が存在しますか?
  • ?|: これらの配列文字列のいずれかがトップレベルのキーとして存在しますか?
  • ?&: これらの配列文字列はトップレベルのキーとして存在しますか?

問題は、公式の 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート