Запрос критериев гибернации на разные свойства разных объектов - PullRequest
16 голосов
/ 07 октября 2009

Предположим, у меня есть такие классы, как:

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 здесь.

Ответы [ 3 ]

24 голосов
/ 07 октября 2009

Используйте псевдонимы вместо вложенных критериев:

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"))
 );
4 голосов
/ 07 октября 2009

Вам нужно создать только один объект критерия, например так.

Criteria criteria = session.createCriteria(A.class);
criteria.add(Restriction.disjunction()
    .add(Restriction.eq("b.foo", "something"))
    .add(Restriction.eq("c.bar", 0)));
3 голосов
/ 07 октября 2009

В случае, если кто-то найдет это полезным, я нашел более сложный ответ на проблему, которая, по-видимому, разрешена 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...