转义hstore包含JDBC Prepared语句中的运算符

Sam*_*eth 8 postgresql jdbc hstore

我正在使用PostgreSQL 9.1.4和hstore以及PostgreSQL JDBC驱动程序(9.1-901.jdbc4).

我试图使用包含运算符(?,?&,?|在一个PreparedStatement),但是?字符被解析为一个变量占位符.可以转义此字符以在查询中发送正确的运算符吗?

一个例子:

PreparedStatement stmt = conn.prepareStatement("SELECT a, b FROM table1 WHERE c ? 'foo' AND d = ?");
stmt.setInt(1, dValue);
stmt.executeQuery();
Run Code Online (Sandbox Code Playgroud)

在此表单中,以下示例将引发异常:

org.postgresql.util.PSQLException: No value specified for parameter 2.
Run Code Online (Sandbox Code Playgroud)

更新:

在调查pgjdbc驱动程序中的查询解析器后,此代码段似乎表明无法转义该?字符.剩下的问题是:

  • JDBC规范中是否有任何允许?转义的东西,而不是参数占位符?
  • 有没有更好的解决这个问题的方法,而不仅仅是使用手动插入查询字符串的变量的简单语句?

aym*_*ric 5

实际上,看起来java SQL解析器不符合hstore.

但由于语法c ? 'foo'相同exist(c, 'foo'),您可以轻松解决此问题.看看下面的页面,看看hstore 的详细运算符是什么.

Postgres hstore文档

  • 重要的是要注意`exists(c,'foo')`不*使用索引.使用和不使用查看查询计划以查看差异. (7认同)
  • 此方法也不适用于JSONB列. (2认同)