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'\"));
但是這樣是不管用的。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;
????}
?????*?轉義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(莫多)