У меня проблема SELECT N + 1 с NHibernate. Поэтому я решил использовать HQL (и даже критерии) для решения этой проблемы.
У меня такая же проблема и с HQL. Сначала позвольте мне показать, как выглядит граф объектов.
- Пользователь (имеет коллекцию UserRoles, т. Е. Отношение один-ко-многим .)
- UserRoles (имеет ссылку много-к-одному обратно на пользователя, а также много-к-одному на роль).
- Роль (имеет отношение один-ко-многим к пользовательским ролям)
Запрос HQL выглядит следующим образом:
from User u
left join fetch u.UserRoles
where u.id = :userID
Первый запрос, который я вижу выполненным, таков: некоторые столбцы были удалены:
select user0_.ID as ID12_0_,
userrole1_.ID as ID33_1_,
user0_.VersionNumber as VersionN2_12_0_,
user0_.Name as UserName12_0_
userrole1_.VersionNumber as VersionN2_33_1_,
userrole1_.UserID as Us11_33_1_,
userrole1_.RoleID as RoleID33_1_,
userrole1_.UserID as Us11_0__,
userrole1_.ID as ID0__
from [User] user0_
left outer join [UserRoles] userrole1_
on user0_.ID = userrole1_.UserID
where user0_.ID = 139
Тогда я вижу много таких запросов (проблема N + 1):
SELECT ...
FROM [UserRoles] userrole0_
WHERE userrole0_.UserID = 64
Я думаю, что проблема в том, что ссылка в UserRoles обратно на User (или даже на тот факт, что UserRoles приводит к Role, что снова приводит к UserRoles, что снова приводит к User).
Я испробовал все виды вариаций HQL-запросов и даже добавил больше объединений, но я не нашел решения, которое избавило бы от этой проблемы.