程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Hibernate過濾器使用竅門

Hibernate過濾器使用竅門

編輯:關於JAVA

本文向大家介紹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)。並且通常來說,先寫參數 , 然後是操作符,最後寫數據庫字段名。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved