Có hai cách giải quyết khả thi:
Sử dụng câu lệnh tĩnh thay vì câu lệnh chuẩn bị sẵn
Đây là cách giải quyết đơn giản nhất, nhưng bạn sẽ mất tất cả các lợi ích từ các câu lệnh đã chuẩn bị (hiệu suất, bảo vệ chèn SQL, v.v.). Tuy nhiên, điều này sẽ hoạt động
try (Statement s = c.createStatement();
ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
...
}
Tránh người điều khiển. Sử dụng một chức năng thay thế (lưu ý:chỉ mục có thể không được sử dụng)
Các toán tử chỉ là đường cú pháp cho một hàm sao lưu tồn tại trong pg_catalog
. Đây là cách tìm tên của các hàm này:
SELECT
oprname,
oprcode || '(' || format_type(oprleft, NULL::integer) || ', '
|| format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator
WHERE oprname = '?|';
Các kết quả trên:
Hàmoprname 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[])
Vì vậy, cách giải quyết đơn giản nhất là không sử dụng toán tử mà thay vào đó là hàm tương ứng:
try (PreparedStatement s = c.prepareStatement(
"select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
ResultSet rs = s.executeQuery()) {
...
}