我遇到了NHibernate的 SELECT N + 1 问题。因此,我研究了使用HQL(甚至是Criterias)来解决问题。
我也遇到了与HQL相同的问题。首先让我展示一下对象图的样子。
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查询变体,甚至添加了更多联接,但我还没有找到解决这个问题的解决方案。