NHibernate – vários JOIN para a mesma mesa por chaves diferentes

Outro problema do NHibernate JOIN.

Eu estou tentando juntar duas propriedades diferentes de uma tabela por diferentes duas chaves. Mas não consigo obter a segunda propriedade JOIN.

Exemplo simplificado –

Minha class –

namespace Domain { public class Message { #region private Members private string _id; private string _senderID; private string _recipientID; private string _recipientName; private string _senderName; #endregion #region Public Properties public virtual string ID { get { return _id; } set { _id = value; } } public virtual string ID { get { return _id; } set { _id = value; } } public virtual string SenderID { get { return _senderID; } set { _senderID= value; } } public virtual string RecipientID { get { return _recipientID; } set { _recipientID= value; } } public virtual string SenderName { get { return _senderName; } set { _senderName= value; } } public virtual string RecipientName { get { return _recipientName; } set { _recipientName= value; } } #endregion #region Constructors public Message() { _id = Guid.NewGuid().ToString(); } #endregion } } 

Mapeamento –

                      

mas eu recebo o seguinte SQL –

 SELECT this_.OID as OID30_0_, this_.SenderID as Sender30_0_, this_.RecipientID as Recipient30_0_, this_1_.CompanyName as SiteID9_0_ FROM Messages this_ left outer join CompanyData this_1_ on this_.SenderID=this_1_.CompanyID left outer join CompanyData this_2_ on this_.RecipientID=this_2_.CompanyID 

E eu quero –

  SELECT this_.OID as OID30_0_, this_.SenderID as Sender30_0_, this_.RecipientID as Recipient30_0_, this_1_.CompenyName as SiteID9_0_ , this_2_.CompanyName as SiteID10_0_ FROM Messages this_ left outer join CompanyData this_1_ on this_.SenderID=this_1_.CompanyID left outer join CompanyData this_2_ on this_.RecipientID=this_2_.CompanyID 

Estou usando o NHibernate 3.2

obrigado

Eu estava espreitando através da internet durante todo o dia para encontrar a solução para o mesmo problema. O que eu encontrei é thread no quadro de hibernação . Eu tomei a solução de Ashkan Aryan . Então, se alguém mais tiver dores de cabeça com a solução e não quiser usar views, postarei meu código que estou usando agora.

Eu tenho que usar de 1 a 12 junções na mesma mesa, então criar visualizações é muito confuso.

 private void addParagraphsQuery(DetachedCriteria sourceQuery, List paragraphsArguments) { DetachedCriteria dc; Conjunction conjunction = Restrictions.Conjunction(); string alias = string.Empty; if (paragraphsArguments != null && paragraphsArguments.Count > 0) { for (int i = 0; i < paragraphsArguments.Count; i++) { alias = "p" + i.ToString(); dc = DetachedCriteria.For().SetProjection(Projections.Id()); dc.CreateAlias("paragraphList", alias); dc.Add(Restrictions.Eq(alias + ".paragraphSectionTemplate", paragraphsArguments[i].ParagraphTemplate)); dc.Add(Restrictions.Like(alias + ".content", paragraphsArguments[i].Argument, MatchMode.Anywhere)); conjunction.Add(Property.ForName("id").In(dc)); } } sourceQuery.Add(conjunction); } 

Saudações,

Mariusz

Aparentemente, isso não pode ser feito no momento com os mapeamentos NHibenate. A solução mais próxima, sugerida por Spencer Ruport , é criar uma visão e mapear o object para ela.