PostgreSQL 使用包含问号“”?”字符的 ASCII-art 运算符进行 JSON 操作。然而官方的 PostgreSQL JDBC 驱动程序将这些问号解释为普通的 JDBC 绑定变量,导致使用时出错
要通过 JDBC 使用这些运算符,有两种解决方法适用:
静态语句:
使用静态这种方法简化了使用,但消除了准备语句的优点,包括性能提升和 SQL 注入。
try (Statement s = c.createStatement(); ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) { ... }
基于函数的方法:
通过使用 pg_catalog 中可用的底层函数来避免使用运算符来识别与特定运算符关联的函数名称。 ,执行以下 SQL 查询:
SELECT oprname, oprcode || '(' || format_type(oprleft, NULL::integer) || ', ' || format_type(oprright, NULL::integer) || ')' AS function FROM pg_operator WHERE oprname = '?|';
对于“?|””运算符,此产生:
oprname function ---------------------------------------------------------------------------------- ?| jsonb_exists_any(jsonb, text[])
将运算符替换为 JDBC 语句中相应的函数:
try (PreparedStatement s = c.prepareStatement( "select jsonb_exists_any('{}'::jsonb, array['a', 'b']"); ResultSet rs = s.executeQuery()) { ... }
以上是如何使用 JDBC 处理带问号的 PostgreSQL JSON(B) 运算符?的详细内容。更多信息请关注PHP中文网其他相关文章!