NHibernate SELECT N + 1尽管使用了具有eager fetch的HQL查询

时间:2011-11-24 12:09:25

标签: nhibernate hql

我遇到了NHibernate的 SELECT N + 1 问题。因此,我研究了使用HQL(甚至是Criterias)来解决问题。

我也遇到了与HQL相同的问题。首先让我展示一下对象图的样子。

  • 用户(具有UserRoles的集合,即一对多关系。)
  • 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 :(得分:0)

您是否可能没有为关联定义fetching strategy