openJPA 遭遇PG 之 like 語法問題

babyyellow發表於2012-03-22
iT商城的轉pg 測試進入程式碼修改階段 ,

openjpa 還是有寫問題的。

sql語句:  select * from tab  t where t.type like ‘%config.%' 

我們java 程式碼裡的寫法是這樣的  “ cyp_nw_app=> select * from ENT_CONSTANTS where lower(type) like '%config.%' ”

在PG 中執行的時候,就變成了 :
[code]
 cyp_nw_app=> select * from ENT_CONSTANTS where lower(type) like '%config.%' escape '\\';  
[/code]

而且還報錯了:
ERROR:  invalid escape string
HINT:  Escape string must be empty or one character.

這個問題還是要從pg 9.1 版本的改變說起:

9.0 之前的版本里  pg 的引數 standard_conforming_strings  預設值是off

也就是我們我們常規意義上的在oracle 裡的寫法 “ cyp_nw_app=> select * from ENT_CONSTANTS where lower(type) like '%config.%' ”  是可以執行的, openjpa 在執行時做了包裝變成了“select * from ENT_CONSTANTS where lower(type) like '%config.%' escape '\\';   ”  是可以執行在pg上的。 

pg9.1版本把這個引數預設修改為 standard_conforming_strings  =on 
PG的文件給出了一個解釋:
{  If the configuration parameter is off, then PostgreSQL recognizes backslash escapes in both regular and escape string constants. However, as of PostgreSQL 9.1, the default is on, meaning that backslash escapes are recognized only in escape string constants. This behavior. is more standards-compliant, but might break applications which rely on the historical behavior, where backslash escapes were always recognized. As a workaround, you can set this parameter to off, but it is better to migrate away from using backslash escapes. If you need to use a backslash escape to represent a special character, write the string constant with an E. }

這個問題 ,目前在openjpa  2.0.0  2.0.1  2.1.1  3個主要版本中都存在。

那麼怎麼辦呢?  關閉pg 的引數是一個選擇,似乎不是很明智。
另一個就是修改java 程式碼的寫法了

一個方式 java 程式碼裡直接寫上 escape 語法 : 
sql= ” select * from ENT_CONSTANTS where lower(type) like '%config.%' escape '\\' “

或者 sql = ” select * from ENT_CONSTANTS where lower(type) like '%config.%' escape E'\\' "
注意這個E 是pg 裡escape 的語法。 這樣基本的問題就解決了。

如果直接在Psql 裡 執行的話 就要寫下面帶E 的那個了

或者 escape  '\'   注意只有一個 \ .

就這個sql 本身還有很多可以改進的地方:

如果根據這個sql 的功能,改寫為更加PG的方式,我會寫為:

sql=" select * from ENT_CONSTANTS where  type  ~*  E'config.' "

至少不用對每行都做lower()的函式運算了。 ~  ~*  是pg 里正則表達的運算子  ~* 不區分大小寫。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-719220/,如需轉載,請註明出處,否則將追究法律責任。

相關文章