В качестве теоретического упражнения вы можете сделать что-то вроде этого:
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)