Maison >base de données >tutoriel mysql >Comment gérer les opérateurs PostgreSQL JSON(B) avec des points d'interrogation à l'aide de JDBC ?

Comment gérer les opérateurs PostgreSQL JSON(B) avec des points d'interrogation à l'aide de JDBC ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-22 18:52:10962parcourir

How to Handle PostgreSQL JSON(B) Operators with Question Marks Using JDBC?

Gestion des opérateurs PostgreSQL JSON(B) avec le caractère de point d'interrogation via JDBC

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.

Solutions de contournement

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn