Hibernate的數據過濾查詢

數據過濾并不是一種常規的數據查詢方法,而是一種整體的篩選方法。數據過濾也可對數據進行篩選,因此,將其放在Hibernate的數據查詢框架中介紹。

如果一旦啟用了數據過濾器,則不管數據查詢,還是數據加載,該過濾器將自動作用于所有數據,只有滿足過濾條件的記錄才會被選出來。

過濾器與定義在類和集合映射文件上的“where”屬性非常相似。它們的區別是過濾器可以帶參數,應用程序可以在運行時決定是否啟用指定的過濾器,以及使用什么樣的參數值。而映射文件上的“where”屬性將一直生效,且無法動態傳入參數。

過濾器的用法很像數據庫視圖,區別是視圖在數據庫中已經定義完成,而過濾器則還需在應用程序中確定參數值。

過濾器的使用分成三步:

(1)定義過濾器。使用filter-def元素定義過濾器;

(2)使用過濾器。使用filter元素使用過濾器;

(3)在代碼中啟用過濾器。

前兩個步驟都是在Hibernate的映射文件中完成的,其中filter-def是hibernate-mapping元素的子元素,而filter元素是class集合元素的子元素。

filter-def元素用于定義一個過濾器,filter則將指定的過濾器應用到指定的持久化類。

一個持久化類或集合可以使用多個過濾器,而一個過濾器也可以作用于多個持久化類或集合。

看下面的映射文件示例:

<?xml version="1.0"?>

<!-- Hibernate配置文件的文件頭,包含DTD等信息 -->

<!DOCTYPE hibernate-mapping

??? PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

??? "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- Hibernate 配置文件的根元素 -->

<hibernate-mapping >

??? <!-- 每個class元素定義一個持久化類 -->

??? <class name="Category" table="category">

??????? <!-- 定義標識屬性 -->

??? ??? <id name="id" column="category_id" >

??? ??????? <!-- 指定主鍵生成器策略 -->

??????? ??? <generator class="native"/>

??? ??? </id>

??????? <!-- 映射name屬性 -->

??? ??? <property name="name" type="string"/>

??????? <!-- 映射effectiveStartDate屬性 -->

??? ??? <property name="effectiveStartDate" column="eff_start_date"

??????? type="java.util.Date"/>

??????? <!-- 映射effectiveEndDate屬性 -->

??? ??? <property name="effectiveEndDate" column="eff_end_date"

??????? type="java.util.Date"/>

??????? <!-- 映射N-N關聯屬性 -->

??? ??? <set cascade="none" inverse="true" name="products"

??????? table="product_category">

??????????? <!-- 定義關聯屬性的key,對應連接表中的外鍵列 -->

??????? ??? <key column="category_id"/>

??????????? <!-- 定義關聯屬性 -->

??????? ??? <many-to-many column="product_id" class="Product"/>

??? ??? </set>

??????? <!-- 使用過濾器,并設置過濾器條件 -->

??? ??? <filter name="effectiveDate" condition=":asOfDate BETWEEN

??????? eff_start_date and eff_end_date"/>

??? </class>

??? <!-- 定義第二個持久化類 -->

??? <class name="Product" table="product">

??????? <!-- 定義標識屬性 -->

??? ??? <id name="id" column="product_id" >

??????????? <!-- 指定主鍵生成器策略 -->

??????? ??? <generator class="native"/>

??? ??? </id>

??????? <!-- 映射name屬性 -->

??? ??? <property name="name" type="string"/>

??????? <!-- 映射stockNumber屬性 -->

??? ??? <property name="stockNumber" column="stock_number" type="int"/>

??????? <!-- 映射effectiveStartDate屬性 -->

??? ??? <property name="effectiveStartDate" column="eff_start_date"

??????? type="java.util.Date"/>

??????? <!-- 映射effectiveEndDate屬性 -->

??? ??? <property name="effectiveEndDate" column="eff_end_date"

??????? type="java.util.Date"/>

??????? <!-- 映射N-N關聯屬性 -->

??????? <set cascade="all" name="categories" fetch="join"

??????? table="product_category" >

??????????? <!-- 定義關聯屬性的key,對應連接表中的外鍵列 -->

??????? ??? <key column="product_id"/>

??????????? <!-- 定義關聯屬性 -->

??????? ??? <many-to-many column="category_id"

??????????????????????? class="Category" fetch="join">

??????????????? <!-- 對關聯屬性使用第一個過濾器 -->

??? ??????????? <filter name="effectiveDate"

??????????????????? condition=":asOfDate BETWEEN eff_start_date and

??????????????????? eff_end_date"/>

??????????????? <!-- 對關聯屬性使用第二個過濾器 -->

??????????? ??? <filter name="category" condition="category_id = :catId"/>

??????????? </many-to-many>

??? ??? </set>

??????? <filter name="effectiveDate" condition=":asOfDate BETWEEN

??????? eff_start_date AND eff_end_date"/>

??? </class>

??? <!-- 定義第一個過濾器,該過濾器包含一個date類型的參數 -->

??? <filter-def name="effectiveDate">

??????? <filter-param name="asOfDate" type="date"/>

??? </filter-def>

??? <!-- 定義第二個過濾器,該過濾器包含一個long類型的參數 -->

??? <filter-def name="category">

??????? <filter-param name="catId" type="long"/>

??? </filter-def>

</hibernate-mapping>

在上面的配置文件中,定義了兩個過濾器,過濾器的定義通過filter-def元素完成。定義過濾器時,只需要指定過濾器的名字,以及過濾器的參數即可。如Java里的一個方法聲明,只有方法名和參數列表,具體的方法實現是沒有的。

過濾器的過濾條件是使用過濾器時才確定的,使用過濾器通過filter元素確定,filter的condition屬性用于確定過濾條件,滿足該條件的記錄才會被抓取到。

系統默認不啟用過濾器,必須顯式通過enableFilter(String filterName)才可以啟用過濾器,該方法返回一個Filter實例,Filter包含setParameter方法用于為過濾器參數賦值。

一旦啟用了過濾器,過濾器在整個Session內有效,所有的數據加載將自動應用該過濾條件,直到調用disableFilter方法。

看下面的使用過濾器的示例代碼:

private void test() throws Exception

{

??? //獲取Hibernate Session對象

??? Session session = HibernateUtil.currentSession();

??? //開始事務

??? Transaction tx = session.beginTransaction();

??? //啟用第一個過濾器

??? session.enableFilter("effectiveDate")

??????????? //為過濾器設置參數

??????????? .setParameter("asOfDate", new Date());

??? //啟動第二個過濾器

??? session.enableFilter("category")

??????????? //為過濾器設置參數

??????????? .setParameter("catId", new Long(2));

??? //執行查詢,該查詢沒有任何的查詢條件

??? Iterator results = session.createQuery("from Product as p")

????????????????????????? .iterate();

??? //遍歷結果集

??? while (results.hasNext())

??? {

??????? Product p = (Product)results.next();

??????? System.out.println(p.getName());

??????? //此處獲取Product關聯的種類,過濾器也將自動應用過濾

??????? Iterator it = p.getCategories().iterator();

??????? System.out.println(p.getCategories().size());

??????? while (it.hasNext())

??????? {

??????????? Category c = (Category)it.next();

??????????? System.out.println(c.getName());

??????? }

??? }

??? tx.commit();

??? HibernateUtil.closeSession();

}

通過使用過濾器定義常用的數據篩選規則,如果是臨時的數據篩選,還是使用常規查詢比較好。對于從前使用行列表達式視圖的地方,此處可以考慮使用過濾器。

轉載于:https://www.cnblogs.com/jadmin/archive/2009/07/19/2206096.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276439.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276439.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

若川知乎高贊:有哪些必看的 JS 庫?

歡迎星標我的公眾號&#xff0c;回復加群&#xff0c;長期交流學習我的知乎回答目前2w閱讀量&#xff0c;270贊&#xff0c;現在發到公眾號聲明原創。必看的js庫&#xff1f;只有當前階段值不值看。我從去年7月起看一些前端庫的源碼&#xff0c;歷時一年才寫了八篇《學習源碼整…

python用for循環求10的因數_python for循環練習(初級)

for循環練習1for i in range(4):print(i)D:\尚硅谷Python\venv\Scripts\python.exe D:/尚硅谷Python/test.py0123for循環練習2for x in range(1,40,5): #間隔5print(x)D:\尚硅谷Python\venv\Scripts\python.exe D:/尚硅谷Python/test.py16111621263136打印99乘法表for i in ran…

基于EasyUI的Web應用程序及過去一年的總結

前言 一個多月之前已經提交了離職申請&#xff0c;好在領導都已經批準了&#xff0c;過幾天就辦理手續了&#xff0c;在此感謝領導的栽培與挽留&#xff0c;感謝各位同事在工作中的給我的幫助&#xff0c;離開這個團隊確實有一些不舍&#xff0c;不為別的&#xff0c;只因為這個…

MySQL外鍵創建失敗1005原因總結

1、安裝mysql有InnoDB的插件擴展 ./configure --prefix/usr/local/mysql --with-pluginscsv,innobase,myisam,heap,innodb_plugin 2、找不到主表中 引用的列 3、主鍵和外鍵的字符編碼不一致 4、外鍵字段與要做外鍵校驗的字段類型不匹配 5、MySQL支持外鍵約束&#xff0c;并…

Hibernate的事件機制

4.8 事 件 機 制 通常&#xff0c;Hibernate執行持久化過程中&#xff0c;應用程序無法參與其中。所有的數據持久化操作&#xff0c;對用戶都是透明的&#xff0c;用戶無法插入自己的動作。 通過事件框架&#xff0c;Hibernate允許應用程序能響應特定的內部事件&#xff0c;從而…

快速使用Vue3最新的15個常用API

之前我寫了一篇博客介紹了Vue3的新特性&#xff0c;簡單了解了一下Vue3都有哪些特色&#xff0c;并且在文末帶大家稍微體驗了一下Vue3中 Compsition API 的簡單使用上一篇文章地址&#xff1a;緊跟尤大的腳步提前體驗Vue3新特性&#xff0c;你不會還沒了解過Vue3吧因為這個月的…

超級馬里奧代碼_任天堂的源碼泄露,揭示超級馬里奧的前世之生

被黑客盯上的任天堂任天堂遭到了史上最大規模的黑客攻擊&#xff0c;Wii 完整源碼、設計以及《寶可夢》多部作品的信息遭到泄露&#xff0c;而此次泄露事件的后續影響似乎也爆發了出來。《馬里奧賽車》和《超級馬里奧世界2》(耀西島)的早期原型視頻&#xff0c;以及《超級馬里奧…

行者寂寞

公元2009年7月20日。閏五月廿八。炎日&#xff0c;汗如雨。晨行。病臥于京西客站。是夜&#xff0c;不能寐。 公元2009年7月21日。閏五月廿九。戲于清華&#xff0c;游于星巴克。汗如雨。是夜&#xff0c;困于京國際機場5小時。 公元2009年7月22日。六月初一。晨時抵寧。大雨。…

Azure PowerShell (1) PowerShell整理

《Windows Azure Platform 系列文章目錄》 把之前Azure ASM的PowerShell都整理好了。 https://github.com/leizhang1984/AzureChinaPowerShell

漫畫 | 前端發展史的江湖恩怨情仇

時間總是過得很快&#xff0c; 似乎快得讓人忘記了昨天&#xff0c;前端WEB領域的發展更是如此&#xff0c;轉眼間已是近30年&#xff0c;時光荏苒&#xff0c;初心不變&#xff0c;在一代又一代前端人的努力下&#xff0c;前端已經是互聯網不可或缺的一部分。然而很多前端打工…

jquery1.9 下檢測瀏覽器類型和版本

原文鏈接&#xff1a;http://blog.csdn.net/lyc_2011_acm/article/details/8749177 Jquery1.9版本中$.browser已被剔除&#xff1a; 判斷瀏覽器類型&#xff1a; $.browser.mozilla /firefox/.test(navigator.userAgent.toLowerCase()); $.browser.webkit /webkit/.test(nav…

python可迭代對象 迭代器生成器_Python可迭代對象、迭代器和生成器

8.1 可迭代對象(Iterable)大部分對象都是可迭代&#xff0c;只要實現了__iter__方法的對象就是可迭代的。__iter__方法會返回迭代器(iterator)本身&#xff0c;例如&#xff1a;>>> lst [1,2,3]>>> lst.__iter__()Python提供一些語句和關鍵字用于訪問可迭代…

Windows Mobile下使用CppUnitLite輸出測試結果

背景 TDD測試驅動開發是當前流行的開發方法及模式。遵循TDD的方法對開發程序庫(Library)特別有用&#xff0c;因為Library就是為第三方提供一定功能接口的實現&#xff0c;使用TDD的方法可以預先為定義的接口提供測試案例&#xff0c;保證實現代碼能通過測試&#xff0c;保證Li…

sql注意事項2點

①對Null的判斷,如果要用<>與null判斷,則都會得到否定結果②insert into時,要把字段顯示指出,不然會因字段位置變化出錯③-一個數時,如果有可能存在Null,則結果會被置為Null解決方法,select出來的結果,最好加isnull判斷轉載于:https://www.cnblogs.com/lishenglyx/archiv…

PHP IE中下載附件問題

重點&#xff1a; 1、在IE中下載附件之前要清空緩存。 2、中文文件名要用urlencode編碼。 Header("Pragma: "); //不加的話&#xff0c;IE中會提示目標主機無法訪問 Header("Cache-Control: "); //不加的話&#xff0c;IE中會提示目標…

10 個你可能還不知道 VS Code 使用技巧

經常幫一些同學 One-on-One 地解決問題&#xff0c;在看部分同學使用 VS Code 的時候&#xff0c;有些蹩腳&#xff0c;實際上一些有用的技巧能夠提高我們的日常工作效率。NO.1一、重構代碼VS Code 提供了一些快速重構代碼的操作&#xff0c;例如&#xff1a;將一整段代碼提取為…

使用MAP文件快速定位程序崩潰代碼行(轉)

作為程序員&#xff0c;平時最擔心見到的事情就是程序發生了崩潰&#xff0c;無論是指針越界還是非法操作&#xff0c;都將給我們的應用系統造成巨大的損失。但在一個大型系統的測試過程中&#xff0c;初期出現程序崩潰似乎成了不可避免的事。其實測試中出現程序崩潰并不可怕&a…

構建安全的Xml Web Service系列之如何察看SoapMessage

上一篇文章地址&#xff1a;構建安全的Xml Web Service系列一之初探使用Soap頭 (5-22 12:53) 要分析Xml Web Service的安全性&#xff0c;首先要解決的問題是我們能了解和清楚Soap消息的格式和內容&#xff0c;如果獲得不了SoapMessage&#xff0c;分析如何能構建安全Xml w…

前端高效開發必備的 js 庫梳理

之前有很多人問學好前端需要學習哪些 js 庫, 主流框架應該學 vue 還是 react ? 針對這些問題, 筆者來說說自己的看法和學習總結.首先我覺得在學習任何知識之前必須要有一個明確的學習目標, 知道自己為什么要學它, 而不是看網上說的一股腦的給你灌輸各種知識, 讓你學習各種庫, …

交叉報表crosstab隱藏列名顯示_SAP軟件 報表查詢之 輸出格式設置

SAP不僅是功能強大、邏輯嚴謹的ERP軟件&#xff0c;還提供了強大的報表查詢功能。SAP的ALV報表展示功能是SAP的一大特點&#xff0c;實現了類似于EXCEL的功能。使用好ALV報表功能可以方便用戶從SAP中取到想要的數據&#xff0c;尤其是財務用戶。大家在使用SAP報表時&#xff0c…