如何使用NHibernate Criteria API进行多个连接查询

5

我有以下数据模型:

Page
- Id      // Pk
- Type    // int

Section
- Id      // Pk
- Page    // Fk

Comment
- Id      // Pk
- Section // Fk
- Date    // DateTime

我将尝试查询与某个页面相关的所有评论(比如说页面ID为2且类型为1),并限制在一定时间范围内。我已经尝试了以下方法:
   var criteria = session.CreateCriteria<Comment>()

   .Add(Restrictions.Eq("Section.Page.Id", pageId))
   .Add(Restrictions.Eq("Section.Page.Type", pageType))
   .Add(Restrictions.Ge("Date", start))
   .Add(Restrictions.Lt("Date", end));

然而,我遇到了一个错误,提示“无法解析属性:TestNamespace.Comment的Page”。这通常表示映射错误,但在所有其他情况下都有效,因此我倾向于认为错误在查询中。
更糟糕的是,在某些情况下,Comment.Section可能为空(有一些评论与部分或页面没有关联)。在这种情况下,我想忽略这些评论。
有什么建议吗?
谢谢!

你可以添加基于标准的损失类型的定义吗? - Richard
嗯,我从某个地方复制了那段代码..应该是注释掉的。我编辑了帖子并修复了错误。 - user315648
2个回答

6
  var criteria = session.CreateCriteria<Comment>()
     .CreateAlias("Section", "section")
     .CreateAlias("section.Page", "page")
     .Add(Restrictions.Eq("page.Id", pageId))
     .Add(Restrictions.Eq("page.Type", pageType))
     .Add(Restrictions.Ge("Date", start))
     .Add(Restrictions.Lt("Date", end));

我根据你的评论更新了代码。具体地,第二行是新增加的,而第三行使用了第二行中的别名代替属性,以此类推。


这是一个错误:错误:42P01:缺少表的FROM子句条目 - user315648

0
你可以使用额外的CreateCriteria调用来浏览数据库结构。
var criteria = session.CreateCriteria<Comment>()
               .Add(Restrictions.Ge("Date", start))
               .Add(Restrictions.Lt("Date", end))
               .CreateCriteria("Section")
               .CreateCriteria("Page")
               .Add(Restrictions.Eq("Id", pageId))
               .Add(Restrictions.Eq("Type", pageType));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接