考えられる回避策は2つあります。
プリペアドステートメントの代わりに静的ステートメントを使用する
これは最も簡単な回避策ですが、プリペアドステートメントからのすべての利点(パフォーマンス、SQLインジェクション保護など)を失います。ただし、これは機能します
try (Statement s = c.createStatement();
ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
...
}
オペレーターは避けてください。代わりに関数を使用してください(注:インデックスは使用されない場合があります)
演算子は、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()) {
...
}