本文向大家介紹Hibernate過濾器,可能好多人還不了解Hibernate過濾器,沒有關系,看完本文你肯 定有不少收獲,希望本文能教會你更多東西。
Hibernate3新增了對某個類或者集合使用預先定義的Hibernate過濾器條件(filter criteria)的功能 。過濾器條件相當於定義一個 非常類似於類和各種集合上的“where”屬性的約束子句,但是過濾器條件 可以帶參數。
應用程序可以在運行時決定是否啟用給定的Hibernate過濾器,以及使用什麼樣的參數值。 過濾器的 用法很像數據庫視圖,只不過是在應用程序中確定使用什麼樣的參數的。
要使用過濾器,必須首先在相應的映射節點中定義。而定義一個過濾器,要用到位於<hibernate- mapping/> 節點之內的<filter-def/>節點:
<filter-def name="myFilter">
<filter-param name="myFilterParam" type="string"/>
</filter-def>
定義好之後,就可以在某個類中使用這個過濾器:
<class name="myClass" ...>
...
<filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
</class>
也可以在某個集合使用它:
<set ...>
<filter name="myFilter" condition=":myFilterParam = MY_FILTERED_COLUMN"/>
</set>
可以在多個類或集合中使用某個過濾器;某個類或者集合中也可以使用多個過濾器。
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的其他部分也大多有這個特性。
下面是一個比較完整的例子,使用了記錄生效日期模式過濾有時效的數據:
<filter-def name="effectiveDate">
<filter-param name="asOfDate" type="date"/>
</filter-def>
<class name="Employee" ...>
...
<many-to-one name="department" column="dept_id" class="Department"/>
<property name="effectiveStartDate" type="date" column="eff_start_dt"/>
<property name="effectiveEndDate" type="date" column="eff_end_dt"/>
...
<!--
Note that this assumes non-terminal records have an eff_end_dt set to
a max db date for simplicity-sake
注意,為了簡單起見,此處假設雇用關系生效期尚未結束的記錄的eff_end_dt 字段的值等於數據庫最大的日期
-->
<filter name="effectiveDate"
condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
</class>
<class name="Department" ...>
...
<set name="employees" lazy="true">
<key column="dept_id"/>
<one-to-many class="Employee"/>
<filter name="effectiveDate"
condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/>
</set>
</class>
定義好後,如果想要保證取回的都是目前處於生效期的記錄,只需在獲取雇員數據的操作之前先開啟 過濾器即可:
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)。並且通常來說,先寫參數 , 然後是操作符,最後寫數據庫字段名。