使用包含问号“?”的 PostgreSQL JSON(B) 运算符在 JDBC 中
JDBC 与 PostgreSQL 的集成在处理带有问号符号的 JSON 运算符(例如?)时带来了挑战。和?|。 PostgreSQL JDBC 驱动程序将这些字符解释为普通绑定变量而不是运算符。
解决方法
有两种解决方案可以解决此问题:
静态语句
这种简单的方法避免了使用准备好的声明。虽然它会损害性能和安全性,但它解决了问题:
try (Statement s = c.createStatement(); ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) { ... }
函数
PostgreSQL 中的运算符通常是 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 JSONB 运算符在 JDBC 中?的详细内容。更多信息请关注PHP中文网其他相关文章!