2011-11-24 80 views
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查詢的各種變體,甚至添加了更多的連接,但是我還沒有找到解決這個問題的方法。

+0

你有這樣的事情嗎? 'from user u left join fetch u.UserRoles r where u.id =:userID and r.Something = something'? – Firo

+0

也許你是否映射了not-found =「ignore」子句? –

回答