温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Hibernate Filter怎么使用

发布时间:2022-09-29 15:50:04 来源:亿速云 阅读:181 作者:iii 栏目:开发技术

本篇内容介绍了“Hibernate Filter怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Hibernate过滤器(filter过滤器)是全局有效的、具有名字、可以带参数的过滤器,对于某个特定的Hibernate session您可以选择是否启用(或禁用)某个过滤器。

Hibernate3的过滤器可以进行预定义,并可绑定在类和集合层。那么什么叫预定义过滤器呢?就是可以定义象"where"子句的限制性子句,但这些 子句是相对类和不同集合的元素的。除了这些过滤器条件可以被参数化外。系统还能决定在运行是指定的过滤器是否应该被打开以及什么值被传入过滤器参数。

过滤器的配置:

为了使用过滤器,它们需要首先被定义,然后和响应的元素绑定。为了定义一个过滤器,我们将使用中的元素来定义Hibernate过滤器。如下所示:

<filter-def name="myFilter"> <filter-param name="myFilterParam" type="string"/></filter-def>

然后我们将这个过滤器附着在一个类上,如下所示:

<class name="myClass" ...>
 ...
 <filter name="myFilter" condition=":myFilterParam = my_filtered_column"/></class>
  或者是
 <filter name="filtertest" condition="id &lt; :myid"/>  &lt; 是小于

或附着在一个集合上。

<set ...> <filter name="myFilter" condition=":myFilterParam = my_filtered_column"/>
    或者是    <filter name="filtertest" condition="id &lt; :myid"/>  &lt; 是小于</set>

这里面的配置相当于在HQL语句中写上where id<:myid

当然,我们也可以两者皆有。

过滤器的用法:

为 了支持新过滤器,Hibernate3.x中新添加了一个接口:org.hibernate.Filter,以及在 org.hibernate.Session中加入了一些新方法。在Session中的新方法有:enableFilter(String filterName), getEnabledFilter(String filterName),以及disableFilter(String filterName)。在默认性况下,对于当前的会话,过滤器是关闭的。它们必须使用session的enableFilter()方法来显式地打开过 滤器。这个方法返回一个新过滤器的实例。按着上述的做法,我们可以用如下的代码打开过滤器:

session.enableFilter("myFilter").setParameter("myFilterParam", "some-value");

过滤大数据集

对于Hibernate3.x以前的版本,处理大数据集必须要使用大量的代码。为了达到目的,必须先将整个数据集装到内存中,然后对这个数据集使用session的filter()方法来过滤。而且当过滤实体时,我们必须手工写全部的HQL或一个定制的拦截器。

而在Hibernate3.x中提供了一种更简捷,更一致的方法来过滤数据。Hibernate设计街头团队想用一个更有效的特性来处理每一件事,无论它们是国际化的还是本地数据,或是为了安全考虑以及其他的事。现在让我们看一个例子来解释这一切。

现在假设有一个实体,这个实体跟着“有效的记录”数据库模式。这个实体有多个行,每一行都根据日期不同而不同,也就是说在日期范围内是有效的。一个 employment记录将是一个非常好的例子,因为employees可以来或去或再回来。现在我们开发一个带UI的程序,这个程序需要处理 employment数据的当前记录。为了使用新的过滤器特性达到这个目的。我们首先需要定义这个过滤器,然后将它附着在Employee类上。

<filter-def name="effectiveDate"> <filter-param name="asOfDate" type="date"/></filter-def><class name="Employee" ...> ...
 <many-to-one name="department" column="dept_id" class="Department"/> <property name="effectiveStartDate" type="date" column="eff_start_dt"/> <property name="effectiveEndDate" type="date" column="eff_end_dt"/> ...
 <filter name="effectiveDate" condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/></class><class name="Department" ...> ...
 <set name="employees" lazy="true">  <key column="dept_id"/>  <one-to-many class="Employee"/>  <filter name="effectiveDate" condition=":asOfDate BETWEEN eff_start_dt and eff_end_dt"/> </set></class>

然后,为了保证总是加在到当前的有效记录。只要简单地将过滤器打开即可,代码如下:

Session session = ...;
session.enabledFilter("effectiveDate").setParameter("asOfDate", new Date());List results = session.createQuery("from Employee as e where e.salary > :targetSalary")
.setLong("targetSalary", new Long(1000000))
.list();

在上面的HQL中,即使我们只给出一个salary约束条件,由于我们已经打开发过滤器,也只会得到当前活动的比一百万多的雇员。

“Hibernate Filter怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI