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!
我究竟做错了什么?
如果有人需要更多信息,我有代码示例......!
你并没有真正做错什么——休眠只是不那样工作。
如果您从 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)
当我第一次遇到这种行为时,我也感到惊讶。这看起来像是一个错误,但我被告知这是设计使然。