Этот вопрос очень похож на этого, но ответы были минимальны к тому вопросу.
У меня есть родительский класс с рядом дочерних объектов. Дочерние объекты являются просто оберткой для строки и живой в другой таблице к родительскому объекту. Я хочу иметь запрос критериев, который возвращает родительские объекты, когда все члены набора дочерних объектов возвращают 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" является набором объектов с полем "значения", которое является строкой. "критерии ()" создают критерии родительского класса. "список ()" просто называет criteria.list ();
Это просто соответствует против любого из элементов, а не всех.
Надежда это имеет смысл. Любая справка очень ценится.
В качестве теоретического упражнения вы можете сделать что-то вроде этого:
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));
Однако этот подход не подходит для практического использования, поскольку требует дополнительного соединения
(из-за отсутствия в элементах
в Criteria API). Также обратите внимание, что он использует двойное отрицание ( SELECT ... WHERE NOT EXISTS (SELECT ... WHERE NOT <условие>)
), поэтому у него могут быть проблемы с 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 (вы не можете написать из p.ands
в подзапросе и не может использовать в элементах
). Итак, в 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)