Hay dos posibles soluciones:
Use declaraciones estáticas, en lugar de declaraciones preparadas
Esta es la solución alternativa más simple, pero pierde todos los beneficios de las declaraciones preparadas (rendimiento, protección contra inyección SQL, etc.). Sin embargo, esto funcionará
try (Statement s = c.createStatement();
ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
...
}
Evite al operador. Utilice una función en su lugar (nota:es posible que no se utilicen índices)
Los operadores son solo azúcar de sintaxis para una función de respaldo que existe en el pg_catalog
. Aquí se explica cómo encontrar el nombre de estas funciones:
SELECT
oprname,
oprcode || '(' || format_type(oprleft, NULL::integer) || ', '
|| format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator
WHERE oprname = '?|';
Lo anterior produce:
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[])
Entonces, la solución más simple es simplemente no usar el operador, sino la función correspondiente en su lugar:
try (PreparedStatement s = c.prepareStatement(
"select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
ResultSet rs = s.executeQuery()) {
...
}