Maison >base de données >tutoriel mysql >Comment utiliser les opérateurs JSON(B) de PostgreSQL avec '?' dans JDBC ?

Comment utiliser les opérateurs JSON(B) de PostgreSQL avec '?' dans JDBC ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-23 15:38:15274parcourir

How to Use PostgreSQL's JSON(B) Operators with

Comprendre les opérateurs JSON(B) PostgreSQL avec le point d'interrogation ""?" dans JDBC

PostgreSQL propose des opérateurs JSON uniques qui incluent un caractère de point d'interrogation dans leurs noms, comme ? pour l'existence de la clé et ?| pour l'existence d'une chaîne de tableau. Cependant, le PostgreSQL officiel. Le pilote JDBC rencontre des difficultés à analyser les chaînes SQL contenant ces opérateurs, les interprétant par erreur comme des variables de liaison JDBC.

Solutions de contournement pour l'utilisation de tels opérateurs via JDBC

Pour les utiliser avec succès opérateurs dans JDBC, considérez ce qui suit solutions de contournement :

Utiliser les instructions statiques

Cette solution de contournement de base élimine l'utilisation d'instructions préparées, permettant ainsi à la chaîne SQL d'être exécutée en tant qu'instruction statique. sacrifie les avantages des déclarations préparées.

try (Statement s = c.createStatement();
     ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
     ...
}

Employ Fonctions

Les opérateurs sont essentiellement des alias syntaxiques pour les fonctions de support dans le pg_catalog L'identification du nom de la fonction vous permet de l'utiliser directement. Par exemple :

SELECT 
  oprname, 
  oprcode || '(' || format_type(oprleft,  NULL::integer) || ', ' 
                 || format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator 
WHERE oprname = '?|';

Cela donne le résultat suivant :

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[])

La solution de contournement consiste à remplacer l'opérateur par sa fonction correspondante :

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