16

假设我有这样的课程:

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

我想要做的是使用“或”子句组合标准B和标准C,例如:

//this does not work
criteriaA.add(Restrictions.disjunction().add(criteriaB).add(criteriaC));

我怎样才能做到这一点?我在这里的 API 有点磕磕绊绊。

4

3 回答 3

25

使用别名而不是嵌套条件:

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-06T22:12:58.263 回答
4

您只需要像这样创建一个标准对象。

Criteria criteria = session.createCriteria(A.class);
criteria.add(Restriction.disjunction()
    .add(Restriction.eq("b.foo", "something"))
    .add(Restriction.eq("c.bar", 0)));
于 2009-10-06T22:16:26.967 回答
3

万一其他人觉得它有用,我发现了一个更复杂的问题答案,这似乎是 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));
于 2009-10-06T22:43:34.440 回答