1. 程式人生 > >hibernate使用@where實現條件過濾功能

hibernate使用@where實現條件過濾功能

程式設計中最常用的功能,增刪改查,而實際業務中真正物理刪除資料的情況是很少的,基本都有使用邏輯刪除,通常採用一個標誌位,比如flag,查詢的時候,flag=1的資料查出,flag=0的資料過濾掉.

使用hibernate的時候,通常不再直接才做sql語句,而是操作實體和HQL相結合的方式,只要維護好實體之間的關係,增刪改查都可以使用極其簡單的方式來完成,哪怕關聯了好多張表好多個實體.

邏輯刪除的時候就是更新一張表,那也只需要維護實體的一個標誌位就可以了,不需要寫HQL語句,如果要把主表和從表裡的標誌位都改變了,還是需要維護實體之間的關係,每個實體的標誌位都設為0就行了.

但是問題出來了,查詢的時候如何才能把標誌位的條件加上,而我並不想寫HQL語句,不想寫類似於"from Entity1 inner jion Entity2 on Etity1.id = Entity2.eId and Etity1.flag = 1 and Etity2.flag = 1" ,如果是少量的實體關聯,比如兩三個還湊合,但是如果有十幾個實體管理,寫起來豈不是要繁瑣無比啊,而且一不小心就容易出錯.

仔細看一下控制檯列印的資料,hibernate的查詢其實也是把HQL轉換成SQL來執行的(當然要這樣做),這就給了我們啟發,hibernate是不是有一個註解專門用來新增where條件的呢?也就是每次從HQL轉換蟲Sql都要給這個表新增這麼條件.如果我是hibernate的設計者,我肯定要這麼做的,因為實現起來不難,而方面性不言而喻.

問了好幾個人都不知道這麼個東西,網上找了半天,不知道該使用什麼關鍵字來搜尋,但一直堅信hibernate肯定沒那麼菜,一定這麼個解決方案.最後才確定@Where這麼個註解

其裡面只有一個引數clause,完整用法是:

@Where(clause = "VALID_FLAG=1")

可以加在實體類上,也可以加在欄位的get方法上,也支援這樣的這樣的辦法
@Where(clause = "VALID_FLAG=1")
List<Topic> topics;

這個條件的意思是進行關聯查詢的時候,我只把Topic中VALID_FLAG = 1的查詢出來.

在表上加一個意味著查詢自己的時候只查詢VALID_FLAG = 1等於1的

有興趣的同學可以去Google中搜索,百度中好像沒有的.