hibernate3提供了一種創新的方式來處理具有「顯性(visibility)」規模的資料,那就是使用hibernate filter。
hibernate filter是全域性有效的、具有名字、可以帶引數的過濾器,對於某個特定的hibernate session可以選擇是否啟用(或禁用)某個過濾器。
hibernate3新增了對某個類或者集合使用預先定義的過濾器條件(filter criteria)的功能。過濾器條件相當於定義乙個 非常類似於類和各種集合上的「where」屬性的約束子句,但是過濾器條件可以帶引數。 應用程式可以在執行時決定是否啟用給定的過濾器,以及使用什麼樣的引數值。 過濾器的用法很像資料庫檢視,只不過是在應用程式中確定使用什麼樣的引數的。
定義好之後,就可以在某個類中使用這個過濾器:
...
也可以在某個集合使用它:
可以在多個類或集合中使用某個過濾器;某個類或者集合中也可以使用多個過濾器。
session
物件中會用到的方法有:enablefilter(string filtername)
,getenabledfilter(string filtername)
, 和disablefilter(string filtername)
. session中預設是不
啟用過濾器的,必須通過session.enabledfilter()
方法顯式的啟用。 該方法返回被啟用的filter
的例項。以上文定義的過濾器為例:
session.enablefilter("myfilter").setparameter("myfilterparam", "some-value");
注意,org.hibernate.filter的方法允許鏈式方法呼叫。(類似上面例子中啟用filter之後設定filter引數這個「方法鏈」) hibernate的其他部分也大多有這個特性。
下面是乙個比較完整的例子,使用了記錄生效日期模式過濾有時效的資料:
... ...
...
定義好後,如果想要保證取回的都是目前處於生效期的記錄,只需在獲取雇員資料的操作之前先開啟過濾器即可:
session session = ...;
session.enabledfilter("effectivedate").setparameter("asofdate", new date());
list results = session.createquery("from employee as e where e.salary > :targetsalary")
.setlong("targetsalary", new long(1000000))
.list();
在上面的hql中,雖然我們僅僅顯式的使用了乙個薪水條件,但因為啟用了過濾器,查詢將僅返回那些目前雇用 關係處於生效期的,並且薪水高於一百萬美刀的雇員的資料。
注意:如果你打算在使用外連線(或者通過hql或load fetching)的同時使用過濾器,要注意條件表示式的方向(左還是右)。 最安全的方式是使用左外連線(left outer joining)。並且通常來說,先寫引數, 然後是操作符,最後寫資料庫欄位名。
在filter定義之後,它可能被附加到多個實體和/或集合類,每個都有自己的條件。假若這些條件都是一樣的,每次都要定義就顯得很繁瑣。因此,被用來定義乙個預設條件,它可能作為屬性或者cdata出現:
xyz">...
abc=xyz
當這個filter被附加到任何目的地,而又沒有指明條件時,這個條件就會被使用。注意,換句話說,你可以通過給filter附加特別的條件來過載預設條件。
Hibernate過濾器使用竅門
本文向大家介紹hibernate過濾器,可能好多人還不了解hibernate過濾器,沒有關係,看完本文你肯定有不少收穫,希望本文能教會你更多東西。hibernate3新增了對某個類或者集合使用預先定義的hibernate過濾器條件 filter criteria 的功能。過濾器條件相當於定義乙個 非...
過濾器的使用
以前一直有用過濾器,但是一直沒有仔細看過,前幾天在看完一本jsp設計的時候才真正有了點體會,這是一本比較基礎的書,在這裡我只是記錄下原 目的很簡單,只是記錄一下,也沒有想要解釋什麼 相信大家一看就會明白了,其實我也不是什麼髙手,只是看到了記錄下來,當成筆記 我想大家感興趣的話還是要買本有此類介紹的書...
過濾器(6) 過濾器的攔截
本系列部落格彙總在這裡 過濾器彙總 我們來做個測試,寫乙個過濾器,指定過濾的資源為 index.jsp,然後我們在瀏覽器中直接訪問 index.jsp,你會發現過濾器執行了!但是,當我們在 helloservlet 中使用伺服器端的跳轉request.getrequestdispathcer ind...