使用注释过滤器是通过@org.hibernate.annotations.FilterDef或定义的@org.hibernate.annotations.FilterDefs。过滤器定义有一个name()和一个参数数组()。参数将允许您在运行时调整过滤器的行为。@ParamDef每个参数都由一个具有名称和类型的参数定义。您还可以为defaultCondition()给定定义一个参数,@FilterDef以设置在每个个体都没有定义时要使用的默认条件@Filter。@FilterDef(s) 可以在类或包级别定义。
我们现在需要定义应用于实体加载或集合加载的 SQL 过滤器子句。@Filter被使用并放置在实体或集合元素上。@FilterName和之间的连接@Filter是一个匹配的名字。
@Entity @FilterDef ( name = "minLength" , parameters = @ParamDef
( name = "minLength" , type = "integer" ) ) @Filters ( { @Filter ( name = " betweenLength " , condition = " : minLength <= length和 :maxLength >= length" ), @Filter ( name = " minLength " , condition =
":minLength <= length" )
} ) public class Forest { ... }
当集合使用关联表作为关系表示时,您可能希望将过滤条件应用于关联表本身或目标实体表。要在目标实体上应用约束,请使用常规@Filter注释。但是,如果要以关联表为目标,请使用@FilterJoinTable注解。
@OneToMany @JoinTable
//在目标实体表上过滤@Filter
( name = "betweenLength" , condition = " :minLength <= length and :maxLength >= length" ) //在关联表上 过滤 @FilterJoinTable ( name = " security” , condition = “:userlevel >= requredLevel” ) public Set < Forest > getForests () { ... }
使用 Hibernate 映射文件来定义过滤器,情况非常相似。必须首先定义过滤器,然后将其附加到适当的映射元素。要定义过滤器,请在<filter-def>元素中使用<hibernate-mapping/>元素:
< filter-def name = "myFilter" >
<过滤器参数名称= “myFilterParam”类型= “字符串” />
</过滤器定义>
然后可以将此过滤器附加到一个类或集合(或者同时附加到两个或多个):
<班级名称= "我的班级" ... >
... <过滤器名称= "myFilter"条件= ":myFilterParam = MY_FILTERED_COLUMN" />
<设置 ... >
<过滤器名称= "myFilter"条件= ":myFilterParam = MY_FILTERED_COLUMN" />
</集> </类>
Session对象中会用到的方法有:enableFilter(String filterName),getEnabledFilter(String filterName),和disableFilter(String filterName)。Session中默认是不启动过滤器的,必须通过Session.enabledFilter()方法显式的启动。该方法返回被启动Filter的为实例:上面的例子。
会议。启用过滤器(“我的过滤器” )。setParameter ( "myFilterParam" , "some-value" );
注意,org.hibernate.Filter 的方法允许链接方式调用。(类似上面例子中启用 Filter 之后设置 Filter 参这个“方法链接”) Hibernate 的其他很多部分。
下面是一个比较完整的例子,使用了记录生命有效日期模式过滤有效的数据:
< filter-def name = "effectiveDate" >
<过滤器参数名称= “asOfDate”类型= “日期” />
</过滤器定义>
<类名= “员工” ... >
... <多对一name = "department" column = "dept_id" class = "Department" />
<属性名= "effectiveStartDate" type = "date" column = "eff_start_dt" />
<属性名称= “effectiveEndDate”类型= “日期”列= “eff_end_dt” />
... <!--
请注意,这假设非终端记录的 eff_end_dt 设置为
为简单起见,最大数据库日期
-->
<过滤器名称= “有效日期”
condition = ":asOfDate BETWEEN eff_start_dt and eff_end_dt" />
</类>
<班级名称= “部门” ... >
... < set name = "employees" lazy = "true" >
<关键列= “dept_id” />
<一对多类= “员工” />
<过滤器名称= “有效日期”
condition = ":asOfDate BETWEEN eff_start_dt and eff_end_dt" />
</套>
</类>
定义好后,如果想保取回的都是目前为止生成期的记录,只需要在获取雇员数据的操作之前先启动过滤器即可:
会话 会话 = ...; 会议。启用过滤器(“有效日期” )。setParameter ( "asOfDate" , new Date ()); 列出 结果 = 会话。createQuery ( "from Employee as e where e.salary > :targetSalary" ) 。setLong (“targetSalary” ,新长(1000000 ))。列表();
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习