【问题标题】:NHibernate - eager fetch a collectionNHibernate - 急切地获取一个集合
【发布时间】:2011-06-24 04:26:04
【问题描述】:

我正在创建一个 HQL 查询,该查询对某些集合和属性使用渴望获取。这是查询:

var result = Session.CreateQuery("from Match m left join fetch m.User u left join fetch u.ProfileItems pi where m.User.Id = :p1")
        .SetParameter("p1", user.Id)
        .List<Match>().ToList();

这很好用。使用 NHProfiler,我可以看到它产生了以下 SQL 查询:

select (...) from `Match` match0_
       left outer join `User` user1_
         on match0_.UserId = user1_.Id
       left outer join `ProfileItem` profileite2_
         on user1_.Id = profileite2_.User_id
where  match0_.UserId =? p0

现在,我可以像这样迭代 Match 实例甚至 User 实例的结果:

foreach (User u in result.Select(m => m.User))
{
  // .. do something
}

...它不会再次访问数据库。

但是,User 对象有一个未映射到数据库的属性 IsOnline。这会使用当前日期进行一些计算。一旦我在表达式中使用这个属性,数据库就会被命中。例如:

int i = result.Count(m => m.MatchingUser.IsOnline);

... 将使用此查询为每个用户访问数据库,在我的情况下为 10 次:

SELECT * FROM   `User` user0_ WHERE  user0_.Id =? p0

我有两个主要问题:

  1. 这是为什么呢?
  2. 如何防止这种情况发生?

谢谢!

【问题讨论】:

  • 你的映射是什么样子的?

标签: nhibernate eager-loading


【解决方案1】:

除非是复制和粘贴错误,否则您使用的属性 (MatchingUser) 与您获取的属性 (User) 不同

【讨论】:

  • 说真的,你不知道这让我觉得多么愚蠢 :-) 这花了我昨天 2 个小时的时间。感谢您详细阅读我的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 2012-11-09
  • 1970-01-01
  • 2011-08-10
  • 2012-12-17
  • 2011-08-14
  • 1970-01-01
相关资源
最近更新 更多