Hibernate3 提供瞭一種創新的方式來處理具有“顯性(visibility)”規則的數據,那就是使用Hibernate filter。 Hibernate filter是全局有效的、具有名字、可以帶參數的過濾器, 對於某個特定的Hibernate session您可以選擇是否啟用(或禁用)某個過濾器。
一旦啟用瞭數據過濾器,則不管是數據查詢,還是數據加載,該過濾器將自動作用於所有數據,隻有滿足過濾條件的記錄才會被選出來。
過濾器條件相當於定義一個 非常類似於類和各種集合上的“where”屬性的約束子句,但是過濾器條件可以帶參數。 應用程序可以在運行時決定是否啟用給定的過濾器,以及使用什麼樣的參數值。 過濾器的用法很像數據庫視圖,隻不過是在應用程序中確定使用什麼樣的參數的。
過濾器分以下幾步:
1、定義過濾器。
要使用過濾器,必須首先在相應的映射節點中定義。而定義一個過濾器,要用到位於<hibernate-mapping/> 節點之內的<filter-def/>節點:
[html]
<filter-def name="myFilter">
<filter-param name="myFilterParam" type="string"/>
</filter-def>
2、使用過濾器。
定義好之後,就可以在某個類中使用這個過濾器。通過<filter…/>元素將指定的過濾器應用到指定的持久化類
[html]
<class name="myClass" …>
…
<filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
</class>
Condition屬性值是一個SQL風格的where子句,因此condition屬性所指定的過濾條件應該根據表明、列名進行過濾。
也可以在某個集合使用它:
[html] view plaincopyprint?
<set …>
<filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
</set>
可以在多個類或集合中使用某個過濾器;某個類或者集合中也可以使用多個過濾器。
3、在程序中通過Session啟用過濾器。
Session對象中會用到的方法有:enableFilter(String filterName), getEnabledFilter(String filterName), 和 disableFilter(String filterName). Session中默認是不啟用過濾器的,必須通過Session.enabledFilter()方法顯式的啟用。 該方法返回被啟用的Filter的實例。以上文定義的過濾器為例:
session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");
下面是一個完整的實例
過濾器的配置文件
[html]
<hibernate-mapping package="com.hibernate.domain">
<!– 映射Person持久化類 –>
<class name="Person" table="person">
<!– 映射標識屬性 –>
<id name="id" column="person_id">
<!– 指定identity的主鍵生成策略 –>
<generator class="identity"/>
</id>
<!– 映射普通屬性 –>
<property name="name" type="string"/>
<property name="age" type="int"/>
<!– 使用數據過濾 –>
<filter name="myFilter" condition=":filterparam = age" />
</class>
<!–定義Filter –>
<filter-def name="myFilter">
<filter-param name="filterparam" type="int"/>
</filter-def>
</hibernate-mapping>
示例程序:
[java]
public class PersonManager {
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//啟動myFilter過濾器,並且設置參數
session.enableFilter("myFilter").setParameter("filterparam", 30);
//查詢person實體,不加任何篩選條件
List list = session.createQuery("from Person as p").list();
for (Iterator iterator=list.iterator();iterator.hasNext();) {
Person person = (Person) iterator.next();
System.out.println(person.getName());
}
}
}
一般來說如果某個篩選條件使用的很頻繁,那麼我們可以將該篩選條件設置為過濾器;如果是臨時的數據篩選,還是使用常規的查詢比較好。
作者:chenssy