ホームページ > データベース > mysql チュートリアル > PostgreSQL の JSON(B) 演算子を「?」で使用する方法JDBCでは?

PostgreSQL の JSON(B) 演算子を「?」で使用する方法JDBCでは?

Barbara Streisand
リリース: 2024-12-23 15:38:15
オリジナル
250 人が閲覧しました

How to Use PostgreSQL's JSON(B) Operators with

JDBC の疑問符 ""?" が付いた PostgreSQL JSON(B) 演算子について

PostgreSQL は、キーの存在には ?、配列文字列の存在には ?| など、名前に疑問符が含まれています。 PostgreSQL JDBC ドライバーは、これらの演算子を含む SQL 文字列の解析で問題が発生し、それらの演算子を JDBC バインド変数として誤って解釈します。

JDBC 経由でこのような演算子を使用する場合の回避策

正常に利用するにはJDBC のこれらの演算子については、次の点を考慮してください。回避策:

静的ステートメントを使用する

try (Statement s = c.createStatement();
     ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
     ...
}
ログイン後にコピー
この基本的な回避策では、準備されたステートメントの使用が排除され、SQL 文字列を静的ステートメントとして実行できるようになります。

準備されたステートメントの利点が犠牲になります。関数

SELECT 
  oprname, 
  oprcode || '(' || format_type(oprleft,  NULL::integer) || ', ' 
                 || format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator 
WHERE oprname = '?|';
ログイン後にコピー
演算子は基本的に、pg_catalog 内のバッキング関数の構文別名です。関数名を識別すると、それを直接使用できます。例:

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 の JSON(B) 演算子を「?」で使用する方法JDBCでは?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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