【问题标题】:NHibernate SELECT N+1 despite using HQL query with eager fetchNHibernate SELECT N+1 尽管使用 HQL 查询和急切获取
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多