Запрос критериев гибернации для сопоставления со всеми дочерними элементами коллекции - PullRequest
7 голосов
/ 22 мая 2010

Этот вопрос очень похож на этот , но ответы на этот вопрос были минимальными.

У меня есть родительский класс с набором дочерних объектов.Дочерние объекты являются просто оболочкой для строки и живут в другой таблице, чем родительский объект.Я хочу получить запрос критерия, который возвращает родительские объекты, когда все члены набора дочерних объектов возвращают true в условие.Это условие соответствует одной из списка строк.Вот где я:

Criteria c = criteria();
Criteria ands = c.createCriteria("ands");
Disjunction dis = Restrictions.disjunction();
for (String value : values) {
    dis.add(Restrictions.like("value", "%" + value + "%"));
}
ands.add(dis);
return list(c);

"ands" - это набор сущностей с полем "value", которое является строкой.«attribute ()» создает критерии для родительского класса."list ()" просто вызывает attribute.list ();

Это просто сопоставление с любым из элементов, а не со всеми.

Надеюсь, это имеет смысл.Любая помощь высоко ценится.

Ответы [ 2 ]

3 голосов
/ 23 мая 2010

В качестве теоретического упражнения вы можете сделать что-то вроде этого:

Criterion condition = ...;

Criteria c = s.createCriteria(Parent.class, "p");
DetachedCriteria dc = DetachedCriteria.forClass(Parent.class, "p2")
    .createCriteria("ands", "c")
    .add(Restrictions.not(condition))
    .add(Property.forName("p.id").eqProperty("p2.id"))
    .setProjection(Projections.id());

c.add(Subqueries.notExists(dc));

Однако этот подход не подходит для практического использования, поскольку требует дополнительного join (из-за отсутствия условия in elements в Criteria API). Также обратите внимание, что он использует двойное отрицание (SELECT ... WHERE NOT EXISTS (SELECT ... WHERE NOT <condition>)), поэтому у него могут быть проблемы с NULL s.

РЕДАКТИРОВАТЬ: В HQL это можно записать так:

from Parent p
where not exists (select c from p.ands c where not <condition>)

или

from Parent p
where not exists (select c from Child c 
    where not <condition> and c in elements(p.ands))

Но, насколько я понимаю, оба запроса нельзя выразить в Criteria API (вы не можете написать from p.ands в подзапросе и не можете использовать in elements). Итак, в Criteria API вы должны использовать дополнительное объединение (примечание 2 Parent s):

from Parent p
where not exists (select c from Parent p2 join p2.ands c 
    where not <condition> and p = p2)
0 голосов
/ 23 мая 2010

Не должно ли это дизъюнкция быть соединением?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...