2012-08-13 67 views
8

我正在使用PostgreSQL 9.1.4與hstore和PostgreSQL JDBC驅動程序(9.1-901.jdbc4)。轉義hstore在JDBC準備語句中包含運算符

我試圖使用包含在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司機this snippet調查的查詢分析器後似乎表明它不可能逃脫?角色。仍然存在的問題是:

  • 是否有JDBC規範,它允許?被逃脫,比參數佔位符以外的任何東西嗎?
  • 是否有更好的解決此問題的方法,而不僅僅是使用普通語句和手動插入查詢字符串的變量?
+0

不知道任何JDBC,但'd = $ 1'工作? – 2012-08-13 19:28:47

+0

不,這不是有效的語法。在$ 1處引發語法錯誤。 – 2012-08-13 22:23:44

+0

許多PostgreSQL接口喜歡編號佔位符(即'$ 1','$ 2',...),我猜JDBC不是其中之一。 – 2012-08-14 07:31:54

回答

5

實際上,它看起來像java SQL解析器不符合hstore。

但由於語法c ? 'foo'相當於exist(c, 'foo'),因此可以輕鬆解決此問題。看看下面的頁面,看看詳細的運營商爲hstore。

Postgres hstore documentation

+0

謝謝,我沒有在那裏看到詳細的操作符。 – 2012-08-15 11:06:42

+7

重要的是要注意'exists(c,'foo')'不*使用索引。查看查詢計劃有無查看差異。 – magneticMonster 2012-11-20 21:09:56

+2

此方法不適用於JSONB列。 – expert 2016-01-27 00:00:40

-1

如果你想添加使用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'

+0

這與問題沒有任何關係 – 2013-09-01 17:30:44