NHibernate:如何在数据库的单次往返中执行许多子孙(对象图)的热切子选择?

sin*_*law 13 nhibernate subquery eager-loading

首先,请不要试图争论我做出的热切负载 - 遍历对象图并导致(通过延迟加载)甚至超过一次往返数据库只是不是一种选择.

我有一个大的对象图.我想获取根对象,以及它的子,孙子,曾孙等的子集.目前我通过创建多个Future对象(使用Criteria)来执行此操作,并且在每个对象中,我这样做SetFetchMode("...", FetchMode.Eager)- 请参阅Ayende的帖子Sam的第3条评论在这里.有两个问题:

  1. NHibernate在同一个往返中执行多个选择查询 - 从根到叶子(A.B.C.D)的每个路径一个,这很好,但使用join而不是subselect我真正想要它做的事情.使用join意味着需要从数据库发送大量数据,需要进行解析,并且nhibernate需要做更多的工作而不是必要的.

  2. 问题1的结果 - 在某些情况下,对象的重复嵌套多于一层.

第二个问题我通过将我的集合设置为Set来"解决",但后来我失去了排序能力 - 因为我必须指定ISet为接口,我的代码无法知道该集合是否真的是一个OrderedSet.

有没有人知道如何执行,在一次往返,急切加载一个对象加上几个深层嵌套的集合,但不使用连接?

我非常感激!我已经在网上搜索了答案,显然我不是第一个打到这堵墙的人.

Pie*_*ter 1

您只需调用 1 次 SetFetchMode 即可创建单独的查询,并使用 MultiCriteria(或 Futures 或您想要使用的任何内容)一次性运行它们。之后,只有第一个查询的结果与您相关。这将在一次往返中为您提供一个结果。