【发布时间】:2014-01-21 08:52:50
【问题描述】:
我正在尝试让 NHibernate 基于 3 个表的内部连接进行简单查询:
var sessionCriteria = session.CreateCriteria<FoobarMaster>("M")
.CreateCriteria("Accounts", "A", NHibernate.SqlCommand.JoinType.InnerJoin)
.CreateCriteria("TrackingRecords", "T", NHibernate.SqlCommand.JoinType.InnerJoin)
.Add(Restrictions.Eq("T.PicNumber", "123456"));
var foobarMaster = sessionCriteria.UniqueResult<FoobarMaster>();
在 LINQ 中也是如此:
from m in session.Query<FoobarMaster>()
from a in m.Accounts
from t in a.TrackingRecords
where t.PicNumber == "12345"
select m
我使用 QueryOvers 和 JoinAliases 也有同样的事情。总之,我遇到了运行时异常:
“无法解析属性:TrackingNo of: Account”。
这很奇怪,因为 TrackingNo 是 TrackingRecord 属性而不是 Account 属性。它甚至以 T 为前缀——TrackingRecord 的别名。
这是我的映射:
<class name="FoobarMaster" table="T_FOOBAR_MASTER">
<id name="FoobarMasterId" column="FOOBAR_MASTER_ID" type="int">
<generator class="identity"/></id>
<bag name="Accounts" cascade="all" inverse="true">
<key column="FOOBAR_MASTER_ID" />
<one-to-many class="FoobarAccount" />
</bag>
...
<class name="FoobarAccount" table="T_FOOBAR_ACCOUNT">
<id name="FoobarAccountId" column="FOOBAR_ACCOUNT_ID" type="int">
<generator class="identity"/></id>
<many-to-one name="FoobarMaster" class="FoobarMaster" column="FOOBAR_MASTER_ID" />
<property name="AccountId" column="ACCOUNT_ID" />
<bag name="TrackingRecords" cascade="all" inverse="true">
<key column="ACCOUNT_ID" />
<one-to-many class="FoobarAccount" />
</bag>
...
<class name="TrackingRecord" table="T_TRACKING">
<id name="TrackingId" column="TRACKING_ID" type="int"><generator class="identity"/></id>
<many-to-one name="FoobarAccount" class="FoobarAccount" column="ACCOUNT_ID" />
<property name="PicNumber" column="PICNUMBER" type="AnsiString" length="25" />
...
这里是类/实体:
public class FoobarMaster
{
public virtual int FoobarMasterId { get; set; }
public virtual IList<FoobarAccount> Accounts { get; set; }
...
public class FoobarAccount
{
public virtual int FoobarAccountId { get; set; }
public virtual FoobarMaster FoobarMaster { get; set; }
public virtual int AccountId { get; set; }
public virtual IList<TrackingRecord> TrackingRecords { get; set; }
...
public class TrackingRecord
{
public virtual long TrackingId { get; set; }
public virtual FoobarAccount FoobarAccount { get; set; }
public virtual string PicNumber { get; set; }
...
【问题讨论】:
-
您的 LINQ 版本运行正常吗?你能发布你的映射吗
-
LINQ 版本给出了同样的错误。我在上面发布了它,我还发布了映射。谢谢。
-
我认为没有像 Erik 所描述的分离查询是不可能的。我发现了以下内容:blogs.taiga.nl/martijn/2008/11/20/…。我很失望。你可以毫不费力地在 Ruby on Rails 中做到这一点......
-
@MrTibs 只是出于好奇。你看到我更新的答案了吗?你的映射是错误的,因为
TrackingRecords有一对多的<one-to-many class="FoobarAccount" />。这就是问题。还是您问题中的 sn-p 仍然“已调整”?换句话说,您尝试执行的查询是正确的。我确实测试过,一旦映射正确......我只是好奇;);)
标签: nhibernate nhibernate-mapping nhibernate-criteria