【问题标题】:Specify Association Depth in Nhibernate Criteria在 Nhibernate Criteria 中指定关联深度
【发布时间】:2013-08-28 18:34:30
【问题描述】:

好的,假设我有一个多对多、学生/班级对象。用下面的映射

      HasManyToMany(m => m.Classes)
                .Table("StudentClasses")
                .LazyLoad()
                .Cascade.None();

和查询:

       return _session.CreateCriteria<Student>()
                               .Add(Restrictions.Eq("Id", studentId))
                               .SetCacheable(false)
                               .UniqueResult<Student>();

我的桌子

    ID | Student           ID | Class              StudentId | ClassId
    ============           ===========             ===================
    1  | John              1 | Algebra             1         | 1
    2  | Sue               2 | Biology             1         | 2
    3  | Frank             3 | Speech              2         | 2
    4  | Jim               4 | Athletics           2         | 5
    5  | Frankenstein      5 | History             5         | 5

我想要的是约翰,代数和生物学 这来了,但是生物学是约翰和苏,她反过来给我生物和历史,这填充了苏和弗兰肯斯坦。你不想得到弗兰肯斯坦(或生物学以外的任何东西)。您也可以在任何时候开始循环骑行。

我如何指定不填充那么深? SetMaxRows 显然不是我要寻找的,因为它减少了总行数,我只想补充第一级。我特别困惑,因为我认为 LazyLoading 会迫使我准确指定我想要补充的水分

【问题讨论】:

  • 你怎么知道约翰和苏也回来了?

标签: nhibernate fluent-nhibernate nhibernate-criteria


【解决方案1】:

延迟加载让您不必指定您想要补充的水分。这些集合将在您访问它们时“懒惰地”填充。您的上述查询只会获取一行:John。当您访问john.Classes 时,NHibernate 将在后台执行另一个查询以获取 John 的类。然后,当您访问 biology.Students 属性时,NHibernate 将执行另一个查询来填充该集合......等等。

确实想要在这种关系上进行延迟加载(顺便说一下,这是默认设置)。如果您关闭延迟加载,那么这将完全按照您说的要避免的方式进行 - NHibernate 会知道不允许延迟加载这些集合,因此它会在您加载学生后立即开始加载它们,这可能最终会加载这三个表中的所有数据,并且以非常低效的方式与数据库进行大量往返。

如果您知道您想要的只是“约翰,代数和生物学”,那么您应该将这些行添加到您的查询中:

    .SetFetchMode("Classes", FetchMode.Eager)
    .SetResultTransformer(Transformers.DistinctRootEntity)

SetFetchMode 告诉 NHibernate 使用左外连接来预填充 student.Classes 集合。 DistintRootEntity 告诉 NHibernate 不要返回将由左外连接生成的重复学生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多