3

J'ai une UserEntity qui mappé comme et obtenu Impossible d'aller chercher plusieurs sacs. erreurFluent nhibernate mappent plusieurs tables

public UserEntityMap : ClassMap<UserEntity> 
{ 
    //Other properties 
    HasMany(x => x.Addresses).KeyColumn("User_id").Fetch.Join(); 
    HasMany(x => x.Roles).KeyColumn("User_id").Fetch.Join(); 
} 

Je veux obtenir les adresses et les rôles lorsque je crée une requête pour userentity. Que dois-je faire pour voir une sortie comme

Select * from UserEntity u 
    join Addresses a on u.id=a.User_id 
    join Roles r on u.id=r.User_id where u.id=? 

Répondre

2

Il n'y a aucun moyen comment générer cette instruction SELECT.

Je suggère d'utiliser la récupération par lots. Voir ces pour plus de détails:

La mise en correspondance ajustée:

public UserEntityMap : ClassMap<UserEntity> 
{ 
    //Other properties 
    HasMany(x => x.Addresses) 
     .KeyColumn("User_id").Fetch.Join() 
     .BatchSize(100); 
    HasMany(x => x.Roles) 
     .KeyColumn("User_id").Fetch.Join() 
     .BatchSize(100); 
} 

Cela permettra d'interroger l'entité racine et avec juste quelques CHOISIT obtiennent également leur collections (numéro 1 + N)

Vérifiez également What is the solution for the N+1 issue in hibernate?

+0

Merci Radim. Devrais-je éviter d'utiliser Join sur le mapping? Est-il préférable d'utiliser JoinAlias ​​lors d'une requête sur UserEntity. Comme votre exemple GetCats(), quand je vais avoir userlist je vais demander pour les enfants aussi ne vais-je pas? – eyildiz

+0

Mon approche est - 1) joindre «many-to-one» (schéma en étoile), utiliser des projections (par exemple http://stackoverflow.com/q/24246277/1679310) 2) ** NE JAMAIS ** rejoindre 'one- to-many'. Utilisez des sous-requêtes pour filtrer les collections (par exemple http://stackoverflow.com/q/23772548/1679310) et laissez NHibernate les charger par lots ... –