专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 Hibernate过滤器的介绍

Hibernate过滤器的介绍

更新时间:2022-11-21 08:28:53 来源:赢咖4 浏览543次

使用注释过滤器是通过@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 ))。列表(); 

 

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>