如何使用左连接查询在NHibernate中实现分页

时间:2010-03-26 21:16:46

标签: nhibernate sql-server-2008 hql

我有一个NHibernate查询,如下所示:

        var query = Session.CreateQuery(@"
              select o
              from Order o
                left join o.Products p
              where
                (o.CompanyId = :companyId) AND
                (p.Status = :processing)
              order by o.UpdatedOn desc")
              .SetParameter("companyId", companyId)
              .SetParameter("processing", Status.Processing)
              .SetResultTransformer(Transformers.DistinctRootEntity);

        var data = query.List<Order>();

我想为此查询实现分页,因此我只返回x行而不是整个结果集。

我知道SetMaxResults()SetFirstResult(),但由于left joinDistinctRootEntity,可能会返回少于x个订单。

我也尝试了"select distinct o",但是为此生成的sql(使用sqlserver 2008方言)似乎忽略了第一个之后页面的distinct(我认为{{3}是问题)。

实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

在这些情况下,最好在两个查询中进行,而不是一个:

  1. 加载订单页面,不加入
  2. 使用in运算符
  3. 将这些订单与其产品一起加载

    http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx

    有一个稍微复杂的例子

答案 1 :(得分:1)

使用SetResultTransformer(Transformers.AliasToBean())并获取不是实体的数据。

另一种解决方案是您更改查询。 正如我所看到的那样,您正在退回有正在处理的产品的订单。 所以你可以使用exists语句。检查13.11的nhibernate手册。子查询。