9

我将 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();

在这种形式下,以下示例将引发异常:

org.postgresql.util.PSQLException: No value specified for parameter 2.

更新:

在调查了 pgjdbc 驱动程序中的查询解析器之后,这个片段似乎表明无法转义该?字符。剩下的问题是:

  • JDBC 规范中是否有任何内容允许?转义 a 并且是参数占位符以外的任何内容?
  • 除了使用将变量手动插入查询字符串的普通语句之外,还有什么更好的解决方法吗?
4

3 回答 3

5

实际上,看起来 java SQL 解析器不兼容 hstore。

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

Postgres hstore 文档

于 2012-08-14T18:20:48.903 回答
2

There is a discussion about this issue on pgsql-hackers mailing list: http://grokbase.com/t/postgresql/pgsql-hackers/1325c6ys9n/alias-hstores-to-so-that-it-works-with-jdbc

For now I like most this workaround which also supports indexes:

CREATE FUNCTION exist_inline (hstore, text) RETURNS bool AS $$ SELECT $1 ? $2; $$ LANGUAGE sql;
于 2013-09-01T17:56:52.053 回答
0

如果您想使用 PreparedStatement 添加多个键值对,则可以执行以下操作:

PreparedStatement ps = c.prepareStatement(
                     "insert into xyz(id, data) values(?, hstore(?, ?))");

ps.setLong(1, 23456L);
ps.setArray(2, c.createArrayOf("text", new String[]{"name", "city"}));
ps.setArray(3, c.createArrayOf("text", new String[]{"Duke", "Valley"}));

这将插入:23456, 'name=>Duke, city=>Valley'

于 2013-02-06T00:06:23.890 回答