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)
Ê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. –
Hmmm, je pensais que c'était le cas. Laissez-moi vérifier pour être sûr. Merci pour l'information! –
[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. –