由于公司最近将oracle项目移植到db2 中间出现了很多兼容性问题,这里主要记录下hibernate中模糊查询的兼容性问题
例子(hql):from table t where t.name like '%' || t.displayName || '%';
如果遇到这种情况,在oracle里面是完美兼容,到了db2就出问题了
解决方案:使用locate函数,上面这种情况可以修改成如下
from table t where locate(t.dispalyName,t.name)>0;//这里等于1就等同于上面sql语句的结果
from table t where locate(t.dispalyName,t.name)=1;,//1就是在name中从第一位开始匹配displayName
from table t where locate(t.dispalyName,t.name)=0;//等于0的结果是排除模糊匹配到的结果,也就是查出匹 配不到的所有数据;
from table t where locate(t.dispalyName,t.name)=2;//2就是在t.name中从第二位开始匹配dispalyName;
接下来=3,4,5,6相信大家都理解了.
locate(String param1,String param2,int param3) 从param2的第param3位置开始,返回param1第一次出现的位置,param3为负数的情况暂时还没去研究.
hibernate中使用locate会根据你配置的不同方言去解析对应的函数
注意:oracle中locate的参数是反的!!!!
在oracle中要达到上面例子的结果要这样写:from table t where locate(t.name,t.dispalyName)=1;
下面是官方实例(可以参考):
返回一个字符串在另一个字符串中的位置。
LOCATE( string-expression-1, string-expression-2 [, integer-expression ] )
string-expression-1 被搜索的字符串。
string-expression-2 要搜索的字符串。此字符串的长度不应超过 255 个字节。
integer-expression 字符串中开始进行搜索的字符位置。第一个字符在位置 1。如果起始偏移是负值,则定位函数返回最后一个匹配字符串偏移而非第一个。负的偏移指示从搜索中排除字符串尾的多长一部分。排除的字节数计算公式为 (-1 * 偏移) -1。
INT
如果指定了 integer-expression,则从字符串中的该偏移处开始搜索。
第一个字符串可以是长字符串(长于 255 个字节),但第二个字符串的长度不能超过 255 个字节。如果第二个参数是长字符串,此函数返回 NULL 值。如果未找到字符串,则返回 0。搜索零长度字符串将返回 1。如果有某个参数为 NULL,则结果为 NULL。
如果使用多字节字符,并具有适当的归类,则开始位置和返回值可能不同于字节 的位置。
此函数支持 NCHAR 输入和/或输出。
SQL/2008 服务商扩充。
以下语句返回值 8。
SELECT LOCATE( 'office party this week - rsvp as soon as possible', 'party', 2 ); |
以下语句
BEGIN DECLARE STR LONG VARCHAR; DECLARE POS INT; SET str = 'c:\test\functions\locate.sql'; SET pos = LOCATE( str, '\', -1 ); select str, pos, SUBSTR( str, 1, pos -1 ) AS path, SUBSTR( str, pos +1 ) AS filename; END; |
返回以下输出:
c:\test\functions\locate.sql | 18 | c:\test\functions | locate.sql |