使用NHibernate部分填充子集合

6 c# nhibernate

我一直在努力解决这个问题,似乎无法弄明白......

我有一个BlogPost类,它有一个集合Comments,每个注释都有一个DatePosted字段.

我需要做的是查询a BlogPost并使用部分加载的Comments集合返回它,比如2009年8月1日发布的所有评论.

我有这个问题:

BlogPost post = session.CreateCriteria<BlogPost>()
    .Add(Restrictions.Eq("Id", 1))
    .CreateAlias("Comments", "c")
    .Add(Restrictions.Eq("c.DatePosted", new DateTime(2009, 8, 1)))
    .UniqueResult<BlogPost>();
Run Code Online (Sandbox Code Playgroud)

当我运行此查询并检查生成的sql时,它首先针对BlogPost表运行查询,加入Comment具有正确日期限制的表,然后在Comment返回所有内容的表上运行第二个查询.

结果是完全填满了班级的Comments集合BlogPost!

我究竟做错了什么?

如果有人需要更多信息,我有代码示例......!

non*_*ont 0

你并没有真正做错什么——休眠只是不那样工作。

如果您从 BlogPost 导航到评论,Hibernate 将根据您指定的关联映射而不是用于检索 BlogPost 的查询来填充评论。大概您的映射只是在键列上进行连接。您可以使用滤镜来获得您想要的效果。但我认为这仍然会获取所有评论,然后进行后过滤。

更简单,只需查询您想要的内容:

List<Comments> comments = session.CreateCriteria<BlogPost>()
            .Add(Restrictions.Eq("Id", 1))
            .CreateAlias("Comments", "c")
            .Add(Restrictions.Eq("c.DatePosted", new DateTime(2009, 8, 1)))
            .list();
Run Code Online (Sandbox Code Playgroud)

事实上,这只会返回指定日期的评论。如果这让你感觉更好,你可以这样设置:

post.setComments(comments); //having already retreived the post elsewhere
Run Code Online (Sandbox Code Playgroud)

当我第一次遇到这种行为时,我也感到惊讶。这看起来像是一个错误,但我被告知这是设计使然。