NHibernate如何在没有保湿对象的情况下制作Criteria内部连接?

时间:2011-03-14 08:51:16

标签: nhibernate criteria inner-join

一些快速的nhibernate问题:

我有sql表:

Item { Id, Name }
ItemRange { Id, Name }
ItemHasItemRange { Id, ItemId, ItemRangeId } 

映射很简单,所以我不会粘贴它们,ItemId和ItemRangeId是外键,Item类将ItemHasItemRanges集合映射为lazy bag。

我想要所有特别是ItemRange的项目,但我不想检索关联的ItemRangeObjects,我只是想做内连接以缩小结果。

当我这样做的时候:

c.CreateCriteria("Item", "i")
  .CreateAlias("ItemHasItemRanges", "ihpr", JoinType.InnerJoin)
  .Add(Restrictions.Eq("ihpr.ItemRange.Id", I18nHelper.CurrentItemRange.Id));

它工作正常,但所有 ItemHasItemRange 对象也被提取到 Item.ItemHasItemRanges 集合(被映射为惰性)

我不想获取Item.ItemHasItemRanges,因为它需要时间。我只是想做内连接来限制结果集。在NHibernate中有可能吗?

2 个答案:

答案 0 :(得分:0)

所以我认为你只是想要检索这些对象以显示概述/列表,而你实际上不会对这些对象“做”某些事情(除非加载其中一个)?

在这种情况下,我认为您最好使用“预测”。 这是场景:

  • 你必须创建一个(简单)类,它只包含你想要显示的属性(你感兴趣的地方)。

  • 你必须将该类“导入”NHibernate,以便NHibernate知道它的存在。

  • 接下来,您可以像现在一样创建Criteria语句。 (使用您的域类)。

  • 然后,您应该指定投影的外观。也就是说,Item实体的属性如何映射到'DTO'/ View类的属性(=您刚刚创建的简单类)。

  • 指定应使用AliasToBean ResultTransformer。

然后,执行您的Criteria查询。 NHibernate将能够生成所需的最简单的查询,以便检索所有必要的数据。

我已经解释过类似的here

答案 1 :(得分:0)

我发现问题出在其他地方。 ItemHasItemRange表在ItemId和ItemRangeId上没有多个索引 - id在每个字段上只有单独的索引。这就是为什么表现如此糟糕。

但NHibernate问题仍然有效 - 是否可以为条件创建内连接以缩小结果,而不是获取通常是懒惰的所有连接对象。