2011-11-14 38 views
5

別のNHibernate JOINの問題。NHibernate - 異なるキーで同じテーブルへの複数のJOIN

私は異なる2つの キーで1つのテーブルから2つの異なるプロパティに参加しようとしています。 しかし、私は2番目のJOINプロパティを取得できません。

簡体例 -

私のクラス -

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

マッピング -

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

が、私は、次の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 

をそして私が欲しい -

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 

私は

おかげで

+0

私は、マッピングに何かを見ることはできません。クラスコードも投稿できますか? –

+0

これを実行すると、RecipientNameには何が挿入されますか? SenderNameの値は?私はこれがバグかもしれないと思う傾向がある。 nHibernateがあなたのために間違って最適化しようとしている可能性があります。 –

+0

はい、そうです、RecipientNameはSenderName値で埋められます。最適化を無効にすることはできますか? –

答えて

2

どうやら、これはNHibenateマッピングで、現時点では行うことはできませんNHibernateは3.2を使用しています。 Spencer Ruportで示唆されている最も近い解決策は、ビューを作成し、それにオブジェクトをマップすることです。

3

私は同じ問題を解決するために一日中インターネットに潜んでいました。 私が見つけたものはhibernate boardのスレッドです。私はAshkan Aryanから解決策を取った。だから誰かが解決策についての頭痛を覚え、ビューを使用したくない場合は、私が今使っているコードを投稿します。

同じテーブルで1から12のジョインを使用する必要があります。そのため、ビューを作成するのは非常に混乱します。

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

よろしく、

マリウシュ

関連する問題