NHibernate -外部连接,而不是懒惰,忽略未找到-如何在一条语句中构建对象

本文关键字:一条 对象 构建 语句 连接 外部 NHibernate | 更新日期: 2023-09-27 18:15:02

我读了很多关于这个的帖子,最后一个是一个声明,说我正在经历的行为是预期的,如果不是首选的方式。

我有一些域模型映射到它们的数据库表。

我使用一个Criteria对象来查询它们。

 var query = session.CreateCriteria(typeof(Posting))
                .CreateAlias("Person", "person", JoinType.InnerJoin).SetFetchMode("Person", FetchMode.Eager)
                .CreateAlias("Location", "location", JoinType.InnerJoin).SetFetchMode("Location", FetchMode.Eager)
                .CreateAlias("Post", "post", JoinType.InnerJoin).SetFetchMode("Post", FetchMode.Eager)
                .CreateAlias("post.Zone", "postzone", JoinType.LeftOuterJoin).SetFetchMode("post.Zone", FetchMode.Select)

它产生了我正在寻找的确切语句。我希望它急切地填充对象(它确实这样做了),并为post留下空值。关系失效的区域。

在我的映射中,我不得不说not-found=ignore (Notfound.Ignore() FNH),由于外部连接导致NH生成许多子查询-都在Zone表上-这对我来说似乎没有必要,特别是因为它已经拥有了填充Zone对象所需的数据。

任何人都可以对我可以对映射或查询/标准进行的任何更改进行任何更改,以保持此负载为单个查询,或者我应该为每个外部连接的记录期望额外的语句吗?

谢谢,山姆

NHibernate -外部连接,而不是懒惰,忽略未找到-如何在一条语句中构建对象

不幸的是,not-found=ignore导致额外的选择是一个已知的问题。在相当长的一段时间内(2007年),NHibernate和Hibernate都有关于这个问题的bug报告,目前除了删除not-found=ignore或更改数据库中的数据外,没有其他已知的解决方案可用。

一个可能的工作,虽然不是一个很好的一个,将有一个存储过程执行查询你想要的,然后从NHibernate调用它。这将删除冗余查询。