Bonjour,
par un "Load", tu veux dire une commande comme :
1 2
| var session = GetCurrentSession();
return session.Load<Carton>(id); |
Les méthodes Load & Get sont déjà existantes dans la session.
Attention : Get te renverra null si il ne trouve pas l'id et Load te renverra un proxy qui lancera une exception si l'objet n'existe pas quand tu voudra y accéder.
Pour forcer le fetching de la collection, tu peux la désactiver dans le mapping (lazy="false") forcer à faire un jointure ("fetch=join")
d'autres méthodes existent également pour le hql, le requetage par criteria & QueryOver
Pour le hql :
from Carton c where c.Id = :id left join fetch c.Inventaire
Pour l'api criteria - setFetchMode
1 2 3 4 5 6
| var result = GetCurrentSession()
.CreateCriteria<Carton>()
.SetFetchMode("Inventaire", FetchMode.Eager)
.Add(Restrictions.Where<PDCInfo>(carton => carton.Id == id))
.SetResultTransformer(Transformers.DistinctRootEntity)
.UniqueResult<Carton>(); |
et enfin pour la queryOver :
1 2 3 4 5 6
| var result = GetCurrentSession()
.QueryOver<Carton>()
.Where(carton => carton.Id == id)
.Fetch(carton => carton.Inventaire).Eager
.TransformUsing(Transformers.DistinctRootEntity)
.SingleOrDefault(); |
Si tu as systématiquement besoin de l'information inventaire, autant la mapper en eager / join dans le mapping.
Sinon, faire une requete, la plus simple possible et spécifier le résultat.
Attention, avec les requêtes à jointure, tu peux te retrouver avec des résultats en double. La raison de la ligne du "Transformers.DistinctRootEntity" c'est pour filtrer par entité racine. il te faudra aussi la spécifier sur l'objet IQuery si tu utilises le hql.
J'ai un peu de mal également à comprendre pourquoi tu met le hql directement dans le code ? perso, je préfère le sortir dans le mapping de manière a n'avoir qu'une grosse partie qui concerne la base de données.
Bref, dans tous les cas, tu as de quoi avancer !
Bonne après midi.
Partager