我想编写一个排除某些实体的休眠标准。这就是我到目前为止所拥有的:
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。
如何将此内容重写为不排除该实体?
答案 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();
我仍然有兴趣知道是否有更好的方法,但这看起来还不错。