使用java中的@Filter hibernate注释过滤集合

时间:2011-10-18 10:09:39

标签: hibernate

我有两个休眠映射实体A和B.

A有2个实体B的集合,我想根据B中保存的属性过滤每个集合(如下面的代码所示)。

@FilterDefs()
class A{

@OneToMany(mappedBy = "productType", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Filter(name = "something", condition = "entityType = 'SKU1'")  
Set<B> set1 = new HashSet<B>();

@OneToMany(mappedBy = "productType", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@Filter(name = "something", condition = "entityType = 'SKU2'")  
Set<B> set2 = new HashSet<B>();

 }

class B{

@ManyToOne(cascade = CascadeType.ALL)
private A productType;

@Column(name = "entity_type")
@Enumerated(EnumType.STRING)
private EntityType entityType;
}

编辑: 我在DAO方法中按照以下建议启用过滤器。但是,我收到以下异常

  

org.hibernate.exception.SQLGrammarException:无法初始化a   集合

如果我使用eager加载方法,我会得到一个例外,无法生成无效的SQL吗?

任何指针?

2 个答案:

答案 0 :(得分:6)

我在Entity中使用FilterDef然后设置我想要使用过滤器的集合。在您的示例中:

class A{
@OneToMany(...)
@Filter(name = "filterName")  
Set<B> set2 = new HashSet<B>();
}

@FilterDef(name = "filterName", 
    defaultCondition = condition,
    parameters = {@ParamDef(name = nameParameter,
    type = typeParameter)})
class B{
}

然后,ssedano说你应该在会话中启用过滤器:

session.enableFilter("filterName")

如果是这样的话,请加上参数:

session.getEnabledFilter(filterName).setParameter(nameParameter,value);

答案 1 :(得分:0)

您必须在DAO中启用过滤器。

session.enableFilter("something");

在检索对象之前。