Hibernate的数据过滤查询.docx
- 文档编号:6695912
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:5
- 大小:16.44KB
Hibernate的数据过滤查询.docx
《Hibernate的数据过滤查询.docx》由会员分享,可在线阅读,更多相关《Hibernate的数据过滤查询.docx(5页珍藏版)》请在冰豆网上搜索。
Hibernate的数据过滤查询
数据过滤并不是一种常规的数据查询方法,而是一种整体的筛选方法。
数据过滤也可对数据进行筛选,因此,将其放在Hibernate的数据查询框架中介绍。
如果一旦启用了数据过滤器,则不管数据查询,还是数据加载,该过滤器将自动作用于所有数据,只有满足过滤条件的记录才会被选出来。
过滤器与定义在类和集合映射文件上的“where”属性非常相似。
它们的区别是过滤器可以带参数,应用程序可以在运行时决定是否启用指定的过滤器,以及使用什么样的参数值。
而映射文件上的“where”属性将一直生效,且无法动态传入参数。
过滤器的用法很像数据库视图,区别是视图在数据库中已经定义完成,而过滤器则还需在应用程序中确定参数值。
过滤器的使用分成三步:
(1)定义过滤器。
使用filter-def元素定义过滤器;
(2)使用过滤器。
使用filter元素使用过滤器;
(3)在代码中启用过滤器。
前两个步骤都是在Hibernate的映射文件中完成的,其中filter-def是hibernate-mapping元素的子元素,而filter元素是class集合元素的子元素。
filter-def元素用于定义一个过滤器,filter则将指定的过滤器应用到指定的持久化类。
一个持久化类或集合可以使用多个过滤器,而一个过滤器也可以作用于多个持久化类或集合。
看下面的映射文件示例:
xmlversion="1.0"?
>
--Hibernate配置文件的文件头,包含DTD等信息-->
DOCTYPEhibernate-mapping
PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"
--Hibernate配置文件的根元素-->
--每个class元素定义一个持久化类-->
--定义标识属性-->
--指定主键生成器策略-->
--映射name属性-->
--映射effectiveStartDate属性-->
type="java.util.Date"/> --映射effectiveEndDate属性--> type="java.util.Date"/> --映射N-N关联属性--> table="product_category"> --定义关联属性的key,对应连接表中的外键列--> --定义关联属性--> --使用过滤器,并设置过滤器条件--> asOfDateBETWEEN eff_start_dateandeff_end_date"/> --定义第二个持久化类--> --定义标识属性--> --指定主键生成器策略--> --映射name属性--> --映射stockNumber属性--> --映射effectiveStartDate属性--> type="java.util.Date"/> --映射effectiveEndDate属性--> type="java.util.Date"/> --映射N-N关联属性--> table="product_category"> --定义关联属性的key,对应连接表中的外键列--> --定义关联属性--> class="Category"fetch="join"> --对关联属性使用第一个过滤器--> condition=": asOfDateBETWEENeff_start_dateand eff_end_date"/> --对关联属性使用第二个过滤器--> catId"/> asOfDateBETWEEN eff_start_dateANDeff_end_date"/> --定义第一个过滤器,该过滤器包含一个date类型的参数--> --定义第二个过滤器,该过滤器包含一个long类型的参数--> 在上面的配置文件中,定义了两个过滤器,过滤器的定义通过filter-def元素完成。 定义过滤器时,只需要指定过滤器的名字,以及过滤器的参数即可。 如Java里的一个方法声明,只有方法名和参数列表,具体的方法实现是没有的。 过滤器的过滤条件是使用过滤器时才确定的,使用过滤器通过filter元素确定,filter的condition属性用于确定过滤条件,满足该条件的记录才会被抓取到。 系统默认不启用过滤器,必须显式通过enableFilter(StringfilterName)才可以启用过滤器,该方法返回一个Filter实例,Filter包含setParameter方法用于为过滤器参数赋值。 一旦启用了过滤器,过滤器在整个Session内有效,所有的数据加载将自动应用该过滤条件,直到调用disableFilter方法。 看下面的使用过滤器的示例代码: privatevoidtest()throwsException { //获取HibernateSession对象 Sessionsession=HibernateUtil.currentSession(); //开始事务 Transactiontx=session.beginTransaction(); //启用第一个过滤器 session.enableFilter("effectiveDate") //为过滤器设置参数 .setParameter("asOfDate",newDate()); //启动第二个过滤器 session.enableFilter("category") //为过滤器设置参数 .setParameter("catId",newLong (2)); //执行查询,该查询没有任何的查询条件 Iteratorresults=session.createQuery("fromProductasp") .iterate(); //遍历结果集 while(results.hasNext()) { Productp=(Product)results.next(); System.out.println(p.getName()); //此处获取Product关联的种类,过滤器也将自动应用过滤 Iteratorit=p.getCategories().iterator(); System.out.println(p.getCategories().size()); while(it.hasNext()) { Categoryc=(Category)it.next(); System.out.println(c.getName()); } } mit(); HibernateUtil.closeSession(); } 通过使用过滤器定义常用的数据筛选规则,如果是临时的数据筛选,还是使用常规查询比较好。 对于从前使用行列表达式视图的地方,此处可以考虑使用过滤器。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate 数据 过滤 查询
![提示](https://static.bdocx.com/images/bang_tan.gif)