Existem duas soluções possíveis:
Use declarações estáticas, em vez de declarações preparadas
Esta é a solução mais simples, mas você perde todos os benefícios das instruções preparadas (desempenho, proteção de injeção de SQL, etc.). No entanto, isso funcionará
try (Statement s = c.createStatement();
ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
...
}
Evite o operador. Use uma função (nota:índices podem não ser usados)
Os operadores são apenas açúcar de sintaxe para uma função de apoio que existe no
pg_catalog
. Veja como encontrar o nome dessas funções:SELECT
oprname,
oprcode || '(' || format_type(oprleft, NULL::integer) || ', '
|| format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator
WHERE oprname = '?|';
O rendimento acima:
Função
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[])
Portanto, a solução mais simples é não usar o operador, mas a função correspondente:
try (PreparedStatement s = c.prepareStatement(
"select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
ResultSet rs = s.executeQuery()) {
...
}