如何编写排除某些实体的条件
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();
我仍然想知道是否有更好的方法,但这似乎很不错。
我想编写一个排除某些实体的休眠条件。这是我目前所拥有的:
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();
我仍然想知道是否有更好的方法,但这似乎很不错。