Il existe deux solutions possibles :
Utilisez des instructions statiques au lieu d'instructions préparées
C'est la solution de contournement la plus simple, mais vous perdez tous les avantages des instructions préparées (performances, protection contre les injections SQL, etc.). Cependant, cela fonctionnera
try (Statement s = c.createStatement();
ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
...
}
Évitez l'opérateur. Utilisez une fonction à la place (remarque :les index peuvent ne pas être utilisés)
Les opérateurs ne sont que du sucre de syntaxe pour une fonction de sauvegarde qui existe dans le pg_catalog
. Voici comment trouver le nom de ces fonctions :
SELECT
oprname,
oprcode || '(' || format_type(oprleft, NULL::integer) || ', '
|| format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator
WHERE oprname = '?|';
Les rendements ci-dessus :
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[])
Ainsi, la solution de contournement la plus simple consiste à ne pas utiliser l'opérateur, mais la fonction correspondante à la place :
try (PreparedStatement s = c.prepareStatement(
"select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
ResultSet rs = s.executeQuery()) {
...
}