使用Hibernate的过滤器可以在获取持久化对象的集合后在应用程序的层面上按照一定的条件过滤一些持久化对象而得到它的子集,其作用类似SQL中的where子句。不同的时过滤的条件不是写在HQL或者SQL中,而是写在映射文件中,配置后即可通过调用Session对象的setFilter()和enableFilter()方法使用该过滤器。

1、配置

 在Hibernate的映射文件中使用<filter-def>标签定义过滤器,使用name属性定义过滤器的名称,使用<filter-param>标签配置其参数,参数定义与HQL相近。如:

 <hibernate-mapping>

   <class name="com.kkoolerter.hibernate.beans.Guestbook" table="tb_guestbook">

     ......   

   </class>

   <filter-def name="nameFilter">
   
      <filter-param name="inputName"  type="java.lang.String" />   

   </filter-def>
 
 </hibernate-mapping>


2、使用<filter>标签声明使用过滤器

 定义过滤器之后即可通过<filter>标签在持久化类或者集合中使用,一个过滤器可以被多个集合或者持久化类使用。<filter>标签name属性设置过滤器名,condition属性设置使用条件。如:


 <hibernate-mapping>

   <class name="com.kkoolerter.hibernate.beans.Guestbook" table="tb_guestbook">

     ......
   
     <filter name="nameFilter" condition="NAME:inputName" /> 

   </class>

   <filter-def name="nameFilter">
  
      <filter-param name="inputName"  type="java.lang.String" />   

   </filter-def>
 
 </hibernate-mapping>

在集合对象中声明使用过的过滤器,如:

<hibernate-mapping>

   <class name="com.kkoolerter.hibernate.beans.Guestbook" table="tb_guestbook">

     ......
   
    <set name="products" cascade="save-update" inverse="true">

       <key column="category_id" />
 
       <one-to-many class="com.kkoolerter.hibernate.beans.Product" />

       <filter name="nameFilter" condition="PRICE:inputPrice" /> 

    </set>

   </class>

   <filter-def name="priceFilter">
  
      <filter-param name="inputPrice"  type="java.lang.Double" />   

   </filter-def>
 
 </hibernate-mapping>

Hibernate的过滤器可以应用在持久化对象及其集合中,并且如果在配置文件定义了多个过滤器,则这些过滤器还可以如同Java Web的Servlet过滤器一样进行连续的链式调用。


3、过滤器的调用

在Hibernate中的过滤器对象使用org.hibernate.Filter类型的对象表示,在Session接口与Filter有关的方法如下:

方法名                                                              解释

public Filter enableFilter(String filterName)                 激活某个过滤器的使用

public Filter getEnabledFilter(String filterName)             获取某个激活的过滤器

public void disableFilter(String filterName)                  停止某个过滤器

默认情况下所有的过滤器都是关闭的。

用法如下:

String hql = "from Guestbook where id between 10 and 200";

Query  query = session.createQuery(hql);

Filter filter = session.enableFilter("nameFilter");

filter.setParameter("inputName","XXXX");

List<Guestbook> list = query.list();

小结:

通过拼凑HQL语句也能实现Hibernate的过滤器功能,但是使用Hibernate过滤可以在应用程序的层面上过滤数据,代码编写也更加灵活和简便。

正确地使用Hibernate的过滤器可以使其在系统的权限控制和个性化访问等功能实现上发挥作用。如果将其和其他拦截技术,如Servlet过滤器结合使用,则可发挥更大的作用,并且提高应用系统的运行效率。