openJPA 遭遇PG 之 like 語法問題
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 里正則表達的運算子 ~* 不區分大小寫。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 語法問題
- goroutine 語法問題Go
- 【Tip】解決like中無法匹配下劃線的問題
- Oracle 解決like中無法匹配下劃線的問題Oracle
- MySQL 中文 like 問題解決MySql
- SQL "like" 運算子的問題SQL
- oracle 中使用like的問題Oracle
- PG 資料庫遭遇 pg_clog file missing 故障.資料庫
- 語法上的小問題
- 解決oracle中not like效率問題Oracle
- 問題:mybatis like 佔位符處理MyBatis
- Python 遭遇 ProxyError 問題記錄PythonError
- SQL Server中巧用另類寫法代替Like語句SQLServer
- latex 語法塊中字型加粗問題、換行問題
- pg 中日期型的計算問題
- JS語法: 由++[[]][+[]]+[+[]] = 10 ?引發的問題JS
- Laravel 框架中 whereRaw like 引數繫結問題Laravel框架
- mysql8.0 部分sql語法報錯問題MySql
- PG備份之pg_basebackup工具
- numa 架構下mysql可能遭遇的swap問題架構MySql
- Dart語法篇之基礎語法(一)Dart
- JavaScript 新語法 「雙問號語法」與「可選鏈語法」JavaScript
- 面試挖坑題:之C語言底層操作問題面試C語言
- JavaScript瀏覽器歷史的語法小問題JavaScript瀏覽器
- [20160809]exp語法問題.txt
- 解決掛起/休眠時遭遇kernel panic問題(轉)
- markdown 標題語法
- MyBatis中Like語句使用總結MyBatis
- 自然語言處理之序列標註問題自然語言處理
- 聊聊PG資料庫的防誤刪除問題資料庫
- 使用pg_stat_statement監控pgsql遇到的問題SQL
- 機器學習無法解決自然語言理解問題 - thegradient機器學習
- [20160803]exp/imp語法問題.txt
- JavaScript語法裡一些難點問題彙總JavaScript
- ceph之pg inactive
- Drools之基礎語法
- gRPC之proto語法RPC
- Hive之 Hql語法解析Hive