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中搜索,百度中好像沒有的.

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