2010-03-26 52 views
2

我有一個NHibernate的查詢,看起來像這樣:如何實現分頁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"爲好,但這是生成(使用SQLSERVER 2008方言)的SQL似乎忽略distinct的第一個頁面後(我認爲this是問題)。

完成此操作的最佳方法是什麼?

回答

1

使用SetResultTransformer(Transformers.AliasToBean())並獲取不是實體的數據。

另一種解決方法是更改​​查詢。 正如我看到你正在返回有正在處理的產品的訂單。 所以你可以使用exists語句。在13.11查看nhibernate手冊。子查詢。

+0

'存在'的想法很有趣......我會試試看。 – 2010-03-26 23:02:00

2

在這種情況下,最好做在兩個查詢,而不是一個:

  1. 負載訂單的頁面,而無需加入
  2. 加載這些訂單與他們的產品,使用in操作

有一個稍微複雜的例子http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx

+0

對於第二步,我想你會手動建立第一步結果中的ID列表。還是有更好/更簡潔的方式? – 2014-03-19 11:24:32

+0

@evanhaas這可能是我4年前的意思:-)但我認爲你可以使用子查詢和HQL分頁。 – 2014-03-19 11:33:46