Ada dua kemungkinan solusi:
Gunakan pernyataan statis, bukan pernyataan siap
Ini adalah solusi paling sederhana, tetapi Anda kehilangan semua manfaat dari pernyataan yang disiapkan (kinerja, perlindungan injeksi SQL, dll.). Namun, ini akan berhasil
try (Statement s = c.createStatement();
ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
...
}
Hindari operator. Gunakan fungsi sebagai gantinya (catatan:indeks mungkin tidak digunakan)
Operator hanyalah gula sintaks untuk fungsi pendukung yang ada di pg_catalog
. Berikut cara mencari nama fungsi tersebut:
SELECT
oprname,
oprcode || '(' || format_type(oprleft, NULL::integer) || ', '
|| format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator
WHERE oprname = '?|';
Hasil di atas:
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[])
Jadi, solusi paling sederhana adalah dengan tidak menggunakan operator, tetapi fungsi yang sesuai sebagai gantinya:
try (PreparedStatement s = c.prepareStatement(
"select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
ResultSet rs = s.executeQuery()) {
...
}