2011-11-14 26 views
5

Otro problema de NHibernate JOIN.NHibernate - multiple JOIN a la misma tabla mediante diferentes claves

Estoy tratando de unir dos propiedades diferentes de una tabla con dos diferentes claves . Pero no puedo obtener la segunda propiedad JOIN.

ejemplo simplificado -

Mi clase -

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 
    } 
} 

Mapping -

<class name="Domain.Message" table="Messages" > 
    <id name="ID"> 
     <column name="OID"/> 
     <generator class="assigned"/> 
    </id> 
    <property name="SenderID" unique="true"> 
     <column name="SenderID" unique="true"/> 
    </property> 
    <property name="RecipientID" unique="true"> 
     <column name="RecipientID" unique="true"/> 
    </property> 
    <join table="CompanyData" optional="true" > 
     <key column="CompanyID" property-ref="SenderID" /> 
     <property name="SenderName" column="CompanyName" unique="true" lazy="false"/> 
    </join> 
    <join table="CompanyData" optional="true" > 
     <key column="CompanyID" property-ref="RecipientID" /> 
     <property name="RecipientName" column="CompanyName" unique="true" lazy="false"/> 
    </join> 
</class> 

pero me sale el siguiente 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 

Y quiero -

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 

estoy usando NHibernate 3.2

Gracias

+0

no pueden ver nada malo con la asignación. ¿Puedes publicar el código de clase también? –

+0

¿Con qué nombre de destinatario se llena cuando ejecuta esto? El valor de SenderName? Me inclino a pensar que esto puede ser un error. nHibernate puede estar intentando optimizar de forma incorrecta para usted. –

+0

Sí, tiene razón, el Nombre de destinatario se completa con el valor de SenderName. ¿Hay algo que pueda hacer para desactivar la optimización? –

Respuesta

2

Al parecer, esto no puede hacerse en el momento con asignaciones NHibenate. La solución más cercana, sugerida por Spencer Ruport, es crear una vista y asignarle el objeto.

3

Estaba acechando a través de Internet todo el día para encontrar la solución al mismo problema. Lo que encontré es hilo en hibernate board. Tomé la solución de Ashkan Aryan. Entonces, si alguien más tiene dolores de cabeza por la solución y no quiere usar vistas, publicaré mi código que estoy usando ahora.

Tengo que usar de 1 a 12 uniones en la misma tabla, por lo que crear vistas es muy confuso.

private void addParagraphsQuery(DetachedCriteria sourceQuery, List<ParagraphContentArgument> 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<Document>().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); 
} 

Saludos,

Mariusz

Cuestiones relacionadas