关于Hibernate3的escape解决方法

不知道大家有没有碰到,还是没有这种需求。就是用like来查询,我们没有用Lucene,Compass这种全文索引的方案,我们只是简单的添加%进行like查询。用户搜索的时候就使用*和?来代表任意和一个。所以要对"%"和"_"进行转义,我们使用的是oracle数据库。sql语句看起来可能是这样的。
Select   *   FROM  t_user  where  nickname  like   ' %Goo/_D '   escape   ' / '
这里对_进行转义了。因为用户昵称包含下划线,如果不进行转义就表示一个任意字符。有时候我们可能还需要对%进行转义。同样的方法在%前加/% 但是比起普通的like语句。多了一个声明转义符的语句。所以我们会想到这样的语句
DetachedCriteria criteria  =  DetachedCriteria.forClass(User. class );
criteria.add(Restrictions.like(
" nickname " , user.getNickname() + " ' escape'/ " ));
但是这样是不管用的。
接下来可能会想到使用Hibernate3的原生sql查询,其实我们不需要这样做。我们还是使用Criteria条件查询。
criteria.add(Restrictions.sqlRestriction( " {alias}.nickname like ? escape'/' " , StringUtil.escapeSQLLike(user.getNickname()), Hibernate.STRING));
这样Hibernate产生的语句就是我们想要的语句了。
     /**
     * 转义like语句中的
     * <code>'_'</code><code>'%'</code>
     * 将<code>'?'</code>转成sql的<code>'/_'</code>
     * 将<code>'%'</code>转成sql的<code>'/%'</code>
     * <p>
     *   例如搜索<code>?aa*bb?c_d%f</code>将转化成<br/>
     *   <code>_aa%bb_c/_d/%f</code>
     * </p>
     * 
@param  likeStr
     * 
@return
     * 
@author  <a href=" http://jdkcn.com ">somebody</a>
     
*/
    
public   static  String escapeSQLLike(String likeStr) {
        String str 
=  StringUtils.replace(likeStr,  " _ " " /_ " );
        str 
=  StringUtils.replace(str,  " % " ,     " /% " );
        str 
=  StringUtils.replace(str,  " ? " " _ " );
        str 
=  StringUtils.replace(str,  " * " " % " );
        
return  str;
    }

创造共用协议:署名,非商业,保持一致   除经特别注明外,本文章版权归 莫多泡泡所有.
署名,非商业用途,保持一致.    somebody(莫多)  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值