更新時間:2022-06-20 09:48:24 來源:動力節點 瀏覽1376次
Hibernate過濾器(filter過濾器)是全局有效的、具有名字、可以帶參數的過濾器,對于某個特定的Hibernate session您可以選擇是否啟用(或禁用)某個過濾器。
Hibernate3的過濾器可以進行預定義,并可綁定在類和集合層。那么什么叫預定義過濾器呢?就是可以定義象"where"子句的限制性子句,但這些 子句是相對類和不同集合的元素的。除了這些過濾器條件可以被參數化外。系統還能決定在運行是指定的過濾器是否應該被打開以及什么值被傳入過濾器參數。
為了使用過濾器,它們需要首先被定義,然后和響應的元素綁定。為了定義一個過濾器,我們將使用中的元素來定義Hibernate過濾器。如下所示:
<filter-def name="myFilter">
<filter-param name="myFilterParam" type="string"/>
</filter-def>
然后我們將這個過濾器附著在一個類上,如下所示:
<class name="myClass" ...>
...
<filter name="myFilter" condition=":myFilterParam = my_filtered_column"/>
</class>
或者是
<filter name="filtertest" condition="id < :myid"/> < 是小于
或附著在一個集合上。
<set ...>
<filter name="myFilter" condition=":myFilterParam = my_filtered_column"/>
或者是
<filter name="filtertest" condition="id < :myid"/> < 是小于
</set>
這里面的配置相當于在HQL語句中寫上where id<:myid
當然,我們也可以兩者皆有。
為 了支持新過濾器,Hibernate3.x中新添加了一個接口:org.hibernate.Filter,以及在 org.hibernate.Session中加入了一些新方法。在Session中的新方法有:enableFilter(String filterName), getEnabledFilter(String filterName),以及disableFilter(String filterName)。在默認性況下,對于當前的會話,過濾器是關閉的。它們必須使用session的enableFilter()方法來顯式地打開過 濾器。這個方法返回一個新過濾器的實例。按著上述的做法,我們可以用如下的代碼打開過濾器:
session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");
對于Hibernate3.x以前的版本,處理大數據集必須要使用大量的代碼。為了達到目的,必須先將整個數據集裝到內存中,然后對這個數據集使用session的filter()方法來過濾。而且當過濾實體時,我們必須手工寫全部的HQL或一個定制的攔截器。
而在Hibernate3.x中提供了一種更簡捷,更一致的方法來過濾數據。Hibernate設計街頭團隊想用一個更有效的特性來處理每一件事,無論它們是國際化的還是本地數據,或是為了安全考慮以及其他的事。現在讓我們看一個例子來解釋這一切。
現在假設有一個實體,這個實體跟著“有效的記錄”數據庫模式。這個實體有多個行,每一行都根據日期不同而不同,也就是說在日期范圍內是有效的。一個 employment記錄將是一個非常好的例子,因為employees可以來或去或再回來。現在我們開發一個帶UI的程序,這個程序需要處理 employment數據的當前記錄。為了使用新的過濾器特性達到這個目的。我們首先需要定義這個過濾器,然后將它附著在Employee類上。
<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"/>
...
<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中,即使我們只給出一個salary約束條件,由于我們已經打開發過濾器,也只會得到當前活動的比一百萬多的雇員。
通過上述介紹,相信大家對Hibernate Filter已經有所了解,大家如果對此比較感興趣,想了解更多相關知識,可以關注一下動力節點的Hibernate入門視頻,里面的課程內容由淺到深,通俗易懂,適合小白學習,希望對大家能夠有所幫助哦。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習