關於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(莫多)75503.html

莫多 2006-10-16 23:29 發表評論
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章