PostgreSQL 提供了独特的 JSON 运算符,其中包括名称中包含问号字符,例如 ? 表示键是否存在,?| 表示数组字符串是否存在。但是,官方 PostgreSQL JDBC 驱动程序遇到了困难。解析包含这些运算符的 SQL 字符串,错误地将它们解释为 JDBC 绑定变量。
要在 JDBC 中成功利用这些运算符,考虑以下解决方法:
这种基本解决方法消除了预准备语句的使用,允许 SQL 字符串作为静态语句执行,但是,它牺牲了预准备语句的优点。
try (Statement s = c.createStatement(); ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) { ... }
运算符本质上是语法pg_catalog 中支持函数的别名允许您直接使用它。例如:
SELECT oprname, oprcode || '(' || format_type(oprleft, NULL::integer) || ', ' || format_type(oprright, NULL::integer) || ')' AS function FROM pg_operator WHERE oprname = '?|';
这会产生以下结果:
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[])
解决方法包括将运算符替换为其相应的函数:
try (PreparedStatement s = c.prepareStatement( "select jsonb_exists_any('{}'::jsonb, array['a', 'b']"); ResultSet rs = s.executeQuery()) { ... }
以上是如何使用 PostgreSQL 的 JSON(B) 运算符和'?”在 JDBC 中?的详细内容。更多信息请关注PHP中文网其他相关文章!