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
Libérer: 2024-12-23 15:38:15
original
284 Les gens l'ont consulté

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']")) {
     ...
}
Copier après la connexion

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 = '?|';
Copier après la connexion

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[])
Copier après la connexion

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()) {
     ...
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal