【发布时间】:2011-11-24 12:09:24
【问题描述】:
我在使用 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 查询的变体,甚至添加了更多的连接,但我还没有找到解决这个问题的解决方案。
【问题讨论】:
-
你有这样的东西吗?
from User u left join fetch u.UserRoles r where u.id = :userID and r.Something = something? -
也许你映射了 not-found="ignore" 子句?
标签: nhibernate hql