PostgreSQL utilise des opérateurs ASCII-art contenant le caractère de point d'interrogation "" ? pour les opérations JSON. Cependant, le pilote JDBC officiel de PostgreSQL interprète ces points d'interrogation comme des variables de liaison JDBC ordinaires, ce qui entraîne des erreurs lors de l'utilisation de eux.
Pour utiliser ces opérateurs via JDBC, deux solutions de contournement sont applicables :
Déclarations statiques :
Utiliser des instructions statiques instructions au lieu des instructions préparées. Cette approche simplifie l'utilisation mais élimine les avantages des instructions préparées, notamment les gains de performances et l'injection SQL. protection.
try (Statement s = c.createStatement(); ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) { ... }
Approche basée sur les fonctions :
Évitez les opérateurs en utilisant les fonctions sous-jacentes disponibles dans pg_catalog pour identifier le nom de fonction associé à un opérateur spécifique. , exécutez la requête SQL suivante :
SELECT oprname, oprcode || '(' || format_type(oprleft, NULL::integer) || ', ' || format_type(oprright, NULL::integer) || ')' AS function FROM pg_operator WHERE oprname = '?|';
Pour l'opérateur "?|"", ceci donne :
oprname function ---------------------------------------------------------------------------------- ?| jsonb_exists_any(jsonb, text[])
Remplacez l'opérateur par la fonction correspondante dans l'instruction JDBC :
try (PreparedStatement s = c.prepareStatement( "select jsonb_exists_any('{}'::jsonb, array['a', 'b']"); ResultSet rs = s.executeQuery()) { ... }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!