hibernate 过滤器- mopishv0的日志- 网易博客

hibernate 过滤器

 

引用


hibernate3新增加了过滤器条件功能,相当于给查询语句增加了一个"where"的约束子句,
但是过滤器可以带参数。
要使用过滤器,首先必须在映射文件中定义。下面给出一个过滤器的例子。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "" >
<hibernate-mapping>
 <class name="com.xian.Parent" table="parent">
  <id name="id" column="parentId">
   <generator class="native"></generator>
  </id>
  <property name="name" type="string" column="name"></property>
  <filter name="myFilter" condition="name like :parentName"></filter>
  <!-- condition属性是定义过滤器的查询条件,其中 name是对应表parent中的字段名 -->
 </class>
 <filter-def name="myFilter">  <!-- filter-def也可以设置condition属性,用来定于默认的查询条件 -->
  <filter-param name="parentName" type="string" />
  <!-- 定义过滤器的参数 -->
 </filter-def>
 
</hibernate-mapping>

查询代码:
session.enableFilter("myFilter").setParameter("parentName", "%p%");
List<Parent> list = session.createQuery("from Parent").list();

生成的sql语句:
Hibernate: select parent0_.parentId as parentId0_, parent0_.name as name0_ from parent parent0_ where parent0_.name like ?

我们发现我们的Hql语句中并没有加限制条件,但是生成的sql语句却有限制条件,说明过滤器起作用了。hibernate默认不启用过滤器的,我
们要使用方法enableFilter()方法来显式的启用过滤器,并且设置参数。

同时,我们也能够给集合中添加过滤器。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "" >
<hibernate-mapping>
 <class name="com.xian.Parent" table="parent">
  <id name="id" column="parentId">
   <generator class="native"></generator>
  </id>
  <property name="name" type="string" column="name"></property>
  <set name="children" inverse="true" cascade="all,delete-orphan">
   <key column="parentId" not-null="true"></key>
   <one-to-many class="com.xian.Child" />
   <filter name="myFilter" condition="childId > :cId"></filter>
   <!-- childId是关联表child的字段名  -->
  </set>
  <filter name="myFilter" condition="name like :parentName"></filter>
  <!-- condition属性是定义过滤器的查询条件,其中 name是对应表中的字段名 -->
 </class>
 <filter-def name="myFilter">  <!-- filter-def也可以设置condition属性,用来定于默认的查询条件 -->
  <filter-param name="parentName" type="string" />
  <filter-param name="cId" type="long"/>
  <!-- 定义过滤器的参数 -->
 </filter-def>
 
</hibernate-mapping>

查询代码:
session.enableFilter("myFilter").setParameter("parentName", "%p%").setParameter("cId", 3l);
Parent p = (Parent) session.load(Parent.class, 1l);
for (Iterator<Child> it = p.getChildren().iterator(); it.hasNext();) {
 //调用getChildren()方法后就使用了过滤器来查询符合条件的child
 Child c = it.next();
 System.out.println(c.getId() + "   " + c.getName());
}

生成的sql语句:
Hibernate: select parent0_.parentId as parentId0_0_, parent0_.name as name0_0_ from parent parent0_ where parent0_.parentId=?
// 这条语句是session的load方法产生的
Hibernate: select children0_.parentId as parentId1_, children0_.childId as childId1_, children0_.childId as childId1_0_, children0_.name
 as name1_0_, children0_.parentId as parentId1_0_ from child children0_ where  children0_.childId > ? and children0_.parentId=?
// 这条是过滤器产生的

郑重声明:资讯 【hibernate 过滤器- mopishv0的日志- 网易博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——