【问题标题】:How to eager fetch a child collection while joining child collection entities to an association如何在将子集合实体加入关联时急切获取子集合
【发布时间】:2010-06-10 21:11:50
【问题描述】:

假设以下虚构布局

经销权 有很多车 有一个制造商

我想写一个查询,告诉我给我一个名称为 X 的经销权,并获得 Cars 集合,但是当你这样做时使用一个针对制造商的连接。我认为这需要使用 ICriteria。我在想这样的事情..

var dealershipQuery = Session.CreateCriteria&lt Dealership&gt("d") .Add(Restrictions.InsenstiveLike("d.Name", "Foo")) .CreateAlias("d.Cars", "c") .SetFetchMode("d.Cars", FetchMode.Select) .SetFetchMode("c.Manufacturer", FetchMode.Join) .UniqueResult&lt Dealership&gt();

但生成的查询看起来与我预期的完全不同。我开始认为某处可能需要 DetachedCriteria,但我不确定。

想法?

【问题讨论】:

    标签: nhibernate hql icriteria eager-loading


    【解决方案1】:

    在同一个查询中获取集合几乎从来都不是最好的解决方案。

    此链接中详细介绍了一种最佳方法:http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx

    就个人而言,我首选的解决方案是在集合和实体中都使用batch-size,并设置为我的默认页面长度的大小。这样一来,您的上述查询将使用 3 个廉价的、可单独缓存的查询来完成,而不是一个昂贵的查询。

    【讨论】:

    • 我应该提到我们使用的是旧版 Oracle,因此批量大小不起作用。
    • 另外,我并不想从经销商处获得两个系列。我希望 Cars 急切地加载其制造商。您发送的链接更多地与单个根目录下的多个集合相关联。
    • batch-size on 实体和集合适用于所有数据库。 Ayende 的解决方案适用于任意数量的收藏;这个想法是您在一个查询中获取根,在另一个查询中获取集合。
    • 实际上批处理大小在 Oracle 9i 上不起作用。它仅添加到 10+ 客户端。
    • 接受作为答案,因为你是正确的。如果你有可用的批量大小,这是正确的做事方式。我想我应该看看让我们的客户升级。
    猜你喜欢
    • 2012-11-02
    • 2012-11-09
    • 2023-03-24
    • 2010-11-24
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    相关资源
    最近更新 更多