gpt4 book ai didi

c# - NHibernate - 通过不同的键多个 JOIN 到同一个表

转载 作者:太空狗 更新时间:2023-10-29 23:17:21 25 4
gpt4 key购买 nike

另一个 NHibernate JOIN 问题。

我正在尝试通过不同的两个连接一个表中的两个不同属性键。但是我无法获取第二个 JOIN 属性。

简化示例 -

我的类(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
}
}

映射-

 <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

我正在使用 NHibernate 3.2

谢谢

最佳答案

我整天潜伏在互联网上寻找同样问题的解决方案。我发现的是 hibernate board 上的线程.我从 Ashkan Aryan 中获取了解决方案.因此,如果其他人对解决方案感到头疼并且不想使用 View ,我将发布我现在正在使用的代码。

我必须在同一个表上使用 1 到 12 个连接,因此创建 View 非常困惑。

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

问候,

马吕斯

关于c# - NHibernate - 通过不同的键多个 JOIN 到同一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8118863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com