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

Mah*_*esh 5 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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我正在我的DAO方法中启用下面建议的过滤器.但是,我收到以下异常

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

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

有什么指针吗?

adr*_*obo 6

我在实体中使用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{
}
Run Code Online (Sandbox Code Playgroud)

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

session.enableFilter("filterName")
Run Code Online (Sandbox Code Playgroud)

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

session.getEnabledFilter(filterName).setParameter(nameParameter,value);
Run Code Online (Sandbox Code Playgroud)


sse*_*ano 0

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

session.enableFilter("something");
Run Code Online (Sandbox Code Playgroud)

在取回物品之前。