2010-03-26 3 views
2

J'ai une requête NHibernate qui ressemble à ceci:Comment implémenter la pagination dans NHibernate avec une jointure gauche requête

 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>(); 

Je veux implémenter la pagination pour cette requête, donc je retourne que les lignes de x au lieu de l'ensemble jeu de résultats

Je sais à propos SetMaxResults() et SetFirstResult(), mais à cause de la left join et DistinctRootEntity, qui pourrait revenir à moins de x commandes.

J'ai essayé "select distinct o" aussi bien, mais le sql généré pour que (en utilisant le SQLServer 2008 dialecte) semble ignorer le distinct des pages après la première (je pense this est le problème).

Quelle est la meilleure façon d'y parvenir?

Répondre

1

Utilisez SetResultTransformer (Transformers.AliasToBean()) et récupérez les données qui ne sont pas l'entité.

L'autre solution est que vous modifiez la requête. Comme je vois que vous retournez des commandes qui ont des produits en cours de traitement. Vous pouvez donc utiliser l'instruction exists. Vérifiez le manuel de nhibernate au 13.11. Sous-requêtes

+0

L'idée 'exists' est intéressant ... Je vais essayer. –

2

Dans ces cas, il est préférable de le faire en deux requêtes au lieu d'un:

  1. Charger une page de commandes, sans joints
  2. charge ces commandes avec leurs produits, en utilisant l'opérateur in

il y a un exemple un peu plus complexe à http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx

+0

Pour l'étape 2, je suppose que vous construisez manuellement une liste d'ID à partir du résultat à l'étape 1. Ou y a-t-il une meilleure/plus concise? –

+0

@evanhaas c'était probablement ce que je voulais dire il y a 4 ans :-) mais je pense que vous pouvez utiliser une sous-requête et une pagination HQL. –

Questions connexes