2010-07-07 7 views
3

J'ai la requête des critères suivants (en utilisant les extensions Lambda):NHibernate - mis en mode récupération sur petits objets

var workflowResult = repository.GetSession() 
       .CreateCriteria<Core.Domain.Application>() 
       .SetFetchMode<Core.Domain.Application>(app => app.ApplicationWorkflows, FetchMode.Join) 
       .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
       .Future<Core.Domain.Application>(); 

Cela fonctionne correctement. Chaque application charge avec empressement la collection ApplicationWorkflows . Cependant, je voudrais aller un plus profond et charger l'objet ApplicationStatus de chaque ApplicationWorkflow. Je peux le faire avec la HQL suivante mais je voudrais traduire par Critères:

var workflowQuery = "SELECT DISTINCT app" + 
           " FROM Application app" + 
           " JOIN FETCH app.ApplicationWorkflows awf" + 
           " JOIN FETCH awf.ApplicationStatus"; 

J'ai conseillé d'utiliser ce qui suit, mais je rencontre des problèmes avec ce travail dans tous les cas:

.SetFetchMode<Core.Domain.Application>(app => app.ApplicationWorkflows[0].ApplicationStatus, FetchMode.Join) 
+0

Êtes-vous sûr que le HQL fonctionne? J'ai essayé quelque chose de similaire dans le passé et j'ai eu des problèmes avec les doublons. 'DistinctRootEntity' n'a pas fait ce à quoi je m'attendais quand je faisais des jointures fictives récursives. –

+0

Hmmm, je pensais que c'était le cas. Laissez-moi vérifier pour être sûr. Merci pour l'information! –

+0

[Cette réponse] (http://stackoverflow.com/questions/5266180/fighting-cartesian-product-x-join-when-using-nhibernate-3-0-0/5285739#5285739) m'a aidé à voir comment utiliser Requêtes QueryOver et Future pour récupérer les enfants et les petits-enfants avec impatience sans retourner les doublons. La technique consiste à décomposer la tâche en différentes requêtes SQL qui sont exécutées dans un seul aller-retour à la base de données. –

Répondre

0

Essayez ceci.

var workflowResult = repository.GetSession() 
       .CreateCriteria<Core.Domain.Application>() 
       .CreateAlias("ApplicationWorkflows", "awf") 
       .SetFetchMode("ApplicationWorkflows", FetchMode.Join) 
       .SetFetchMode("awf.ApplicationStatus", FetchMode.Join) 
       .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
       .Future<Core.Domain.Application>(); 
+0

La dernière fois que j'ai vérifié, 'DistinctRootEntity' ne fonctionnait pas lorsque vous récupériez des petits-enfants comme ça. Assurez-vous que cela ne renvoie pas de doublons. –

Questions connexes