我们可以达到所需的结果(没有 N+1)——但 Futures 不会是正确的 NHibernate 功能。我们可以使用它们,但获取many-to-one
实体的技巧在别处(见下文)。此处所述的期货:http ://ayende.com/blog/3979/nhibernate-futures 的意思是:
... Future() 和 FutureValue() 本质上是一种将查询执行推迟到以后执行的方式,此时 NHibernate 将获得有关应用程序应该做什么的更多信息,并相应地对其进行优化
所以我们可以把更多的查询放到一个批次中。查询可以是例如一组查询,结果是:
- 总检查
- 前 20 个检查预测
- 上周提取的最大金额
- 等等
因此,在这种情况下,我们可以将“不同”类型的查询放入Future
.
但是要获取many-to-one
没有 N+1 的实体 - 我们可以使用标准 Criteria API。因此,即使这些属性被映射为懒惰的选择作为获取:
<many-to-one name="Account" class="FinanceAccount" column="AccountId"
lazy="proxy" fetch="select"/>
此标准将仅创建一个带有左连接的选择:
var list = session.CreateCriteria<Cheque>()
.SetFetchMode("Account", NHibernate.FetchMode.Join)
.SetFetchMode("customer", NHibernate.FetchMode.Join)
.SetFetchMode("Branch", NHibernate.FetchMode.Join)
.Future<Cheque>()
// or
// .List<Cheque>() ... will be the same right now
;
这将导致只有一个 SQL 选择语句,加入 Check 及其引用属性。