Будьте в спящем режиме запрос критериев для соответствия против всех дочерних элементов набора

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

У меня есть родительский класс с рядом дочерних объектов. Дочерние объекты являются просто оберткой для строки и живой в другой таблице к родительскому объекту. Я хочу иметь запрос критериев, который возвращает родительские объекты, когда все члены набора дочерних объектов возвращают 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 ();

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

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

8
задан Community 23 May 2017 в 12:08
поделиться

2 ответа

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

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)
4
ответ дан 6 December 2019 в 00:05
поделиться

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

0
ответ дан 6 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: