關於Hibernate3的escape解決方法

2021-08-22 05:31:13 字數 1400 閱讀 5695

不知道大家有沒有碰到,還是沒有這種需求。就是用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(

".nickname like ? escape'/'

", stringutil.escapesqllike(user.getnickname()), hibernate.string));

這樣hibernate產生的語句就是我們想要的語句了。

/*** 轉義like語句中的

*'_''%'

* 將'?'轉成sql的'/_'

* 將'%'轉成sql的'/%'

* *   例如搜尋?aa*bb?c_d%f將轉化成

*_aa%bb_c/_d/%f

* * 

@param

likestr

* @return

* @author

">somebody

*/public

static

string escapesqllike(string likestr) 

莫多泡泡

所有.

署名,非商業用途,保持一致.

somebody(莫多)

莫多 2006-10-16 23:29

Hibernate 3 事務 查詢

二 查詢 三 1099占用解決方案 既然hibernate要和資料庫互動,那麼事務是必須要掌握的部分 為什麼要鎖 在併發訪問的時候,不使用鎖會導致部分資料並不能儲存到資料庫 private int version 版本號 public void setversion int version publ...

Hibernate3中的更新與刪除

在hibernate2中對某個表進行更新和刪除,必須先把它load出來,在後更改,然後再儲存。這個過程對於批量操作或者對於表關係比較複雜的情況,是很複雜的。在hibernate3中hql語句中已經支援update 和delete 了 但是要注意的是update和delete的hql不是物件導向的了。...

hibernate3中的離線查詢1

假設要通過stuname查詢乙個學生student記錄,可以如下 detachedcriteria dc detachedcriteria.forclass student.class dc.add restrictions.like stuname stuname,matchmode.anywhe...