2

我正在尝试过滤以在进行查询时仅显示“活动”实体,使用过滤器和基本 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 上有过滤器。有什么方法可以在不对每个关联应用单独的过滤器的情况下做我正在寻找的事情?

谢谢!

4

1 回答 1

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");

一次在公共数据访问层。

于 2012-05-30T21:58:07.950 回答