Запрос критериев гибернации по различным свойствам разных объектов
Предположим, что у меня есть классы вроде:
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 здесь.
Ответы
Ответ 1
Используйте псевдонимы вместо вложенных критериев:
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"))
);
Ответ 2
Вам нужно создать только один объект-критерий.
Criteria criteria = session.createCriteria(A.class);
criteria.add(Restriction.disjunction()
.add(Restriction.eq("b.foo", "something"))
.add(Restriction.eq("c.bar", 0)));
Ответ 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));