2015-10-28 1 views
0

J'ai les tables users et users_updateable_data qui ont une relation 1-to-1 (User.UpdateableData). En outre, chaque User peut être dans un Guild (il y a une propriété Guild.Users mappée; User.GuildId est une clé étrangère pour guilds). J'ai donc Guild, Guild.Users, User, User.UpdateableData, User.GuildId.Rejoindre la propriété référencée sur l'élément de collection joint

J'essaie d'obtenir des propriétés spécifiques de users qui répondent à certains critères:

donc je dois faire deux rejoint: guilde + utilisateurs (droit externe) et utilisateur + UPD. Les données.

Voilà comment j'essayé de le faire:

public virtual IEnumerable<UserTournamentInfo> GetTournamentUserToXP() 
    { 
     using (ISession session = SessionFactory.OpenSession()) 
     using (session.BeginTransaction()) 
     { 
      User userAlias = null; 
      User.UpdateableDataContainer userUpdAlias = null; 
      Guild guildAlias = null; 
      UserTournamentInfo dto2 = null; 

      var result = session.QueryOver<Guild>(() => guildAlias) 
       .JoinAlias(x => x.Users,() => userAlias, JoinType.RightOuterJoin) 
       // next line doesn't compile 
       .JoinAlias((User u) => u.UpdateableData,() => userUpdAlias, JoinType.RightOuterJoin) 
       .Select(MakeProjections()) 
       .Where(() => userAlias.TournamentXP > 0) 
       .TransformUsing(Transformers.AliasToBean<UserTournamentInfo>()) 
       .List<UserTournamentInfo>(); 

      session.Transaction.Commit(); 
      return result; 
     } 
    } 

Voici comment je définis les projections:

public static IProjection[] MakeProjections() 
    { 
     Guild guildAlias = null; 
     User userAlias = null; 
     User.UpdateableDataContainer userUpdAlias = null; 
     UserTournamentInfo dto = null; 

     return new[] 
       { 
    Projections.Property(() => userAlias.Id).WithAlias(() => dto.Id), 
    Projections.Property(() => userUpdAlias.TournamentClassXP).WithAlias(() => dto.TournamentClassXP), 
    Projections.Property(() => userUpdAlias.TournamentXP).WithAlias(() => dto.TournamentXP), 
    Projections.Property(() => userAlias.GuildId).WithAlias(() => dto.GuildId), 
    Projections.Property(() => userAlias.League).WithAlias(() => dto.League), 
    Projections.Property(() => guildAlias.League).WithAlias(() => dto.GuildLeague), 
         }; 
    } 

Il a travaillé avant que je décide de diviser users en deux tables - users et users_updateable_data .

Comment faire cette requête de jointure?

Répondre

1

Je l'ai résolu avec HQL:

SELECT 
u.Id as Id, ud.TournamentClassXP as TournamentClassXP, ud.TournamentXP as TournamentXP, u.GuildId as GuildId, u.League as League, g.League as GuildLeague 
FROM Guild g RIGHT OUTER JOIN g.Users u JOIN u.UpdateableData ud 
WHERE ud.TournamentXP > 0