Hibernate的数据过滤查询Word下载.docx
《Hibernate的数据过滤查询Word下载.docx》由会员分享,可在线阅读,更多相关《Hibernate的数据过滤查询Word下载.docx(5页珍藏版)》请在冰豆网上搜索。
filter-def元素用于定义一个过滤器,filter则将指定的过滤器应用到指定的持久化类。
一个持久化类或集合可以使用多个过滤器,而一个过滤器也可以作用于多个持久化类或集合。
看下面的映射文件示例:
<
?
xmlversion="
1.0"
>
!
--Hibernate配置文件的文件头,包含DTD等信息-->
DOCTYPEhibernate-mapping
PUBLIC"
-//Hibernate/HibernateMappingDTD3.0//EN"
"
--Hibernate配置文件的根元素-->
hibernate-mapping>
<
--每个class元素定义一个持久化类-->
classname="
Category"
table="
category"
--定义标识属性-->
idname="
id"
column="
category_id"
>
--指定主键生成器策略-->
generatorclass="
native"
/>
/id>
--映射name属性-->
propertyname="
name"
type="
string"
--映射effectiveStartDate属性-->
effectiveStartDate"
eff_start_date"
java.util.Date"
--映射effectiveEndDate属性-->
effectiveEndDate"
eff_end_date"
--映射N-N关联属性-->
setcascade="
none"
inverse="
true"
name="
products"
product_category"
--定义关联属性的key,对应连接表中的外键列-->
keycolumn="
--定义关联属性-->
many-to-manycolumn="
product_id"
class="
Product"
/set>
--使用过滤器,并设置过滤器条件-->
filtername="
effectiveDate"
condition="
:
asOfDateBETWEEN
eff_start_dateandeff_end_date"
/class>
--定义第二个持久化类-->
product"
--映射stockNumber属性-->
stockNumber"
stock_number"
int"
all"
categories"
fetch="
join"
--对关联属性使用第一个过滤器-->
asOfDateBETWEENeff_start_dateand
eff_end_date"
--对关联属性使用第二个过滤器-->
category_id=:
catId"
/many-to-many>
eff_start_dateANDeff_end_date"
--定义第一个过滤器,该过滤器包含一个date类型的参数-->
filter-defname="
filter-paramname="
asOfDate"
date"
/filter-def>
--定义第二个过滤器,该过滤器包含一个long类型的参数-->
long"
/hibernate-mapping>
在上面的配置文件中,定义了两个过滤器,过滤器的定义通过filter-def元素完成。
定义过滤器时,只需要指定过滤器的名字,以及过滤器的参数即可。
如Java里的一个方法声明,只有方法名和参数列表,具体的方法实现是没有的。
过滤器的过滤条件是使用过滤器时才确定的,使用过滤器通过filter元素确定,filter的condition属性用于确定过滤条件,满足该条件的记录才会被抓取到。
系统默认不启用过滤器,必须显式通过enableFilter(StringfilterName)才可以启用过滤器,该方法返回一个Filter实例,Filter包含setParameter方法用于为过滤器参数赋值。
一旦启用了过滤器,过滤器在整个Session内有效,所有的数据加载将自动应用该过滤条件,直到调用disableFilter方法。
看下面的使用过滤器的示例代码:
privatevoidtest()throwsException
{
//获取HibernateSession对象
Sessionsession=HibernateUtil.currentSession();
//开始事务
Transactiontx=session.beginTransaction();
//启用第一个过滤器
session.enableFilter("
)
//为过滤器设置参数
.setParameter("
newDate());
//启动第二个过滤器
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();
}
通过使用过滤器定义常用的数据筛选规则,如果是临时的数据筛选,还是使用常规查询比较好。
对于从前使用行列表达式视图的地方,此处可以考虑使用过滤器。