我正在尝试过滤以仅在进行查询时显示“活动”实体,使用过滤器和基本MappedSuperClass并遇到相关表类不遵循相同过滤器的问题。
这是我的模型设置:
@FilterDef(name="baseStatus")
@Filter(name="baseStatus", condition= "Status = 'A'")
@MappedSuperclass
public abstract class BaseModel {
@Column(name = "Status", insertable = false)
private String status;
// getters and setters...
}
我也有相关集合的模型,例如..
@Entity
@Table(name = "A")
public class A extends BaseModel {
@OneToMany()
private List<B> bs = new ArrayList<B>(0);
// other model properties
}
@Entity
@Table(name = "B")
public class B extends BaseModel {
// model properties
}
在查询之前,我运行:
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(A.class)
Filter filter = getCurrentSession().enableFilter("baseStatus");
List<A> as = criteria.list();
使用此设置我将正确的过滤器应用于我正在查询的主类,但子集合(“bs”)不会在连接上进行过滤,因此我只剩下活动的“A” “B”的子集合,其中一些“B”处于非活动状态。
理想情况下,我只想在BaseModel上安装过滤器。如果不对每个关联应用单独的过滤器,有没有办法做我正在寻找的东西?
谢谢!
答案 0 :(得分:3)
我最终没有找到一个很好的解决方案而没有构建自定义的东西,所以我最终在每个模型的每个关联表中注释@Filter,如下所示
@FilterDef(name="baseStatus")
@Filter(name="baseStatus", condition= "Status = 'A'")
@MappedSuperclass
public abstract class BaseModel {
@Column(name = "Status", insertable = false)
private String status;
// getters and setters...
}
@Entity
@Table(name = "A")
public class A extends BaseModel {
@OneToMany()
@Filter(name="baseStatus", condition= "Status = 'A'")
private List<B> bs = new ArrayList<B>(0);
// other model properties
}
@Entity
@Table(name = "B")
public class B extends BaseModel {
// model properties
}
虽然不理想,但它仍有效,我仍然只需要打电话
Filter filter = getCurrentSession().enableFilter("baseStatus");
进入公共数据访问层。