Интересный вопрос, и я не нашел простого ответа.Простые попытки использовать «все элементы (p.Children) в (: childList)» не привели к созданию корректного SQL.Этот монстр сработал ...
var query = session.CreateQuery("select p from Parent p join p.Children c where c in (:childList) group by p.Id, p.Name having count(p) = :childListSize");
var children = new[] {session.Load<Child>(1),session.Load<Child>(2),session.Load<Child>(3)};
query.SetParameterList("childList", children);
query.SetParameter("childListSize", children.Length);
Давайте разберем HQL ...
select p from Parent p
join p.Children c
where c in (:childList)
group by p.Id, p.Name
having count(p) = :childListSize
Мы создаем внутреннее соединение с дочерними элементами, которое создает несколько строк, выбирая тестроки, в которых ребенок находится в childList, группируется по родителю и проверяет, получили ли мы ожидаемое количество строк и только возвращаем ли эти родители.Вот так!
Обратите внимание, что вы должны явно указать все свойства в группе по.В противном случае NH включает только Id и группу по неудачам.
Кстати, я запускал это против NH3, хотя я не могу придумать причину, по которой он не будет работать с NH2.1.2.