您好,登錄后才能下訂單哦!
本篇內容介紹了“Hibernate Filter怎么使用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
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怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。