假设我有这样的类:
class A {
B getB();
C getC();
}
class B {
String getFoo();
}
class C {
int getBar();
}
我想在A上过滤条件,在不同的子类属性上过滤两个过滤器,比如:
Criteria criteriaA = session.createCriteria(A.class);
Criteria criteriaB = criteriaA.createCriteria("b").add(Restrictions.eq("foo", "Something"));
Criteria criteriaC = criteriaA.createCriteria("c").add(Restrictions.eq("bar", 0));
我想要做的是使用"or“子句组合criteriaB和criteriaC,类似于:
//this does not work
criteriaA.add(Restrictions.disjunction().add(criteriaB).add(criteriaC));
我如何才能做到这一点呢?我在这里遇到了一点API问题。
发布于 2009-10-06 22:12:58
使用aliases而不是嵌套条件:
Criteria criteria = session.createCriteria(A.class)
.createAlias("b", "b_alias")
.createAlias("c", "c_alias")
.add(Restrictions.disjunction()
.add(Restrictions.eq("b_alias.foo", "Something"))
.add(Restrictions.eq("c_alias.bar", "0"))
);
发布于 2009-10-06 22:16:27
您只需要创建一个criteria对象,如下所示。
Criteria criteria = session.createCriteria(A.class);
criteria.add(Restriction.disjunction()
.add(Restriction.eq("b.foo", "something"))
.add(Restriction.eq("c.bar", 0)));
发布于 2009-10-06 22:43:34
如果其他人觉得它有用,我找到了一个更复杂的问题的答案,这似乎是API允许的,尽管在ChssPly发布他的(更简单的)解决方案之前,我没有测试它:
DetachedCriteria bValues = DetachedCriteria.forClass(A.class);
bValues.createCriteria("b").add(Restrictions.eq("foo", "something"));
DetachedCriteria cValues = DetachedCriteria.forClass(A.class);
cValues.createCriteria("c").add(Restrictions.eq("bar", 0));
Restrictions.or(Subqueries.in("id", bValues), Subqueries.in("id", cValues));
https://stackoverflow.com/questions/1528352
复制相似问题