我有两个休眠映射实体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吗?
任何指针?
答案 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");
在检索对象之前。