博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
openJPA 遭遇PG 之 like 语法问题
阅读量:2496 次
发布时间:2019-05-11

本文共 2117 字,大约阅读时间需要 7 分钟。

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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/133735/viewspace-719220/

你可能感兴趣的文章
iOS在Xcode6中怎么创建OC category文件
查看>>
5、JavaWeb学习之基础篇—标签(自定义&JSTL)
查看>>
8、JavaWEB学习之基础篇—文件上传&下载
查看>>
reRender属性的使用
查看>>
href="javascript:void(0)"
查看>>
h:panelGrid、h:panelGroup标签学习
查看>>
f:facet标签 的用法
查看>>
<h:panelgroup>相当于span元素
查看>>
java中append()的方法
查看>>
必学高级SQL语句
查看>>
经典SQL语句大全
查看>>
log日志记录是什么
查看>>
<rich:modelPanel>标签的使用
查看>>
<h:commandLink>和<h:inputLink>的区别
查看>>
<a4j:keeyAlive>的英文介绍
查看>>
关于list对象的转化问题
查看>>
VOPO对象介绍
查看>>
suse创建的虚拟机,修改ip地址
查看>>
linux的挂载的问题,重启后就挂载就没有了
查看>>
docker原始镜像启动容器并创建Apache服务器实现反向代理
查看>>