1
我遇到了一個SELECT N + 1與NHibernate的問題。因此,我研究了使用HQL(甚至是Criterias)來解決問題。NHibernate SELECT N + 1儘管使用HQL查詢與渴望獲取
我也遇到了與HQL相同的問題。首先讓我看看對象圖是怎樣的。
- 用戶(擁有集合的UserRole,即一個一對多關係。)
- 的UserRole(擁有多到一個參考回到用戶,也是許多到角色)。
- 角色(擁有一個一對多關係的UserRole)
的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返回給用戶的引用(甚至是UserRoles導致角色的事實,這又引回UserRoles,再次導致用戶)。
我已經嘗試了HQL查詢的各種變體,甚至添加了更多的連接,但是我還沒有找到解決這個問題的方法。
你有這樣的事情嗎? 'from user u left join fetch u.UserRoles r where u.id =:userID and r.Something = something'? – Firo
也許你是否映射了not-found =「ignore」子句? –