Как сопоставить всех детей, используя hql - PullRequest
3 голосов
/ 25 ноября 2010

Каков наилучший / предпочтительный способ выбора (отдельного) списка родительских объектов, у которого есть дочерняя коллекция, содержащая совпадения для ВСЕХ записей в списке параметров дочерних элементов?"Версия моего поиска выглядит следующим образом:

select p.Id, p.Name from parent p 
where exists(from p.Children c where c in (:childList))

Однако я немного озадачен тем, как лучше всего выполнить" всю "версию этого поиска.В настоящее время я создаю hql на лету для каждого ребенка, которого я интересую в сопоставлении;что-то вроде этого:

select p.Id, p.Name from parent p 
where :child1 in elements(p.Children)
and   :child2 in elements(p.Children)
-- etc...

Не могу помочь, но думаю, что есть лучший способ сделать это;Кто-нибудь может указать мне правильное направление?

Для справки, я использую NHibernate 2.1.2

Ответы [ 2 ]

2 голосов
/ 25 ноября 2010

Интересный вопрос, и я не нашел простого ответа.Простые попытки использовать «все элементы (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.

1 голос
/ 25 ноября 2010

вы могли бы запросить ребенка и выбрать родителя, пока существует связь, что-то вроде этого ...

select distinct c.Parent.Id, c.Parent.Name from Child c 
where c in (:childList))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...