如何编写标准以排除某些实体

时间:2015-07-01 02:33:21

标签: hibernate hibernate-criteria

我想编写一个排除某些实体的休眠标准。这就是我到目前为止所拥有的:

Criterion exclusion1 = Restrictions.not(Restrictions.conjunction()
    .add(Restrictions.eq("color", "blue");
    .add(Restrictions.eq("type", "aaa"))
    .add(Restrictions.eq("subtype1", "bbb"))
    .add(Restrictions.eq("subtype2", "ccc"));

Criteria crit = session.createCriteria(MyObject.class);
crit.add(exclusion1);

List result = crit.list();

有几个这样的排除标准。这似乎做我想要的,除非如果任何字段为null我想要包含它。例如,color = blue,type = aaa,subtype1和subtype2的实体为null。

如何将此内容重写为排除该实体?

1 个答案:

答案 0 :(得分:1)

这里的东西按照我想要的方式运作。

this answer开始,似乎正确的方法是使用子查询来定义应排除的内容。 e.g。

Criterion exclusion1 = Restrictions.conjunction()
    .add(Restrictions.eq("color", "blue"))
    .add(Restrictions.eq("type", "aaa"))
    .add(Restrictions.eq("subtype1", "bbb"))
    .add(Restrictions.eq("subtype2", "ccc"));

Criterion exclusion2 = Restrictions.conjunction()
    .add(Restrictions.eq("color", "blue"))
    .add(Restrictions.eq("type", "ddd"))
    .add(Restrictions.eq("subtype1", "eee"));

DetachedCriteria excludes = DetachedCriteria.forClass(MyObject.class)
    .add(Restrictions.disjunction()
        .add(exclusion1)
        .add(exclusion2))
    .setProjection(Projections.property("id"));

Criteria crit = session.createCriteria(MyObject.class);
crit.add(Restrictions.eq("state","ok"));
crit.add(Property.forName("id").notIn(excludes));

List results = crit.list();

我仍然有兴趣知道是否有更好的方法,但这看起来还不错。