如何编写排除某些实体的条件

How do I write a criteria to exclude some entities

我想编写一个排除某些实体的休眠条件。这是我目前所拥有的:

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

有几个这样的排除标准。这似乎做我想做的,除了如果任何字段为空,我希望它被包括在内。例如,color = blue、type = aaa、subtype1 和 subtype2 为 null 的实体将被包含在内。

如何将其重写为排除该实体?

这是我想要的方式。

this answer看来,正确的做法似乎是使用子查询来定义应该排除的内容。例如

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

我仍然想知道是否有更好的方法,但这似乎很不错。