NHibernate SELECT N + 1, несмотря на использование HQL-запроса с активной выборкой - PullRequest
1 голос
/ 24 ноября 2011

У меня проблема 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-запросов и даже добавил больше объединений, но я не нашел решения, которое избавило бы от этой проблемы.

1 Ответ

0 голосов
/ 27 ноября 2011

возможно ли, что вы не определили стратегию получения для своих ассоциаций?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...