sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo uso los operadores JSON(B) de PostgreSQL que contienen un signo de interrogación? a través de JDBC

Hay dos posibles soluciones:

Use declaraciones estáticas, en lugar de declaraciones preparadas

Esta es la solución alternativa más simple, pero pierde todos los beneficios de las declaraciones preparadas (rendimiento, protección contra inyección SQL, etc.). Sin embargo, esto funcionará

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

Evite al operador. Utilice una función en su lugar (nota:es posible que no se utilicen índices)

Los operadores son solo azúcar de sintaxis para una función de respaldo que existe en el pg_catalog . Aquí se explica cómo encontrar el nombre de estas funciones:

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

Lo anterior produce:

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

Entonces, la solución más simple es simplemente no usar el operador, sino la función correspondiente en su lugar:

try (PreparedStatement s = c.prepareStatement(
         "select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
     ResultSet rs = s.executeQuery()) {
     ...
}