2025-02-10

 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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *