【发布时间】:2011-07-01 17:34:11
【问题描述】:
NHibernate 3 introduced the With clause 用于标准 API。我正在尝试使用它来限制多对多关系上的连接,而 NHibernate 正在将附加连接限制应用于链接表而不是正确的表。
我在 Player 和 Address 之间有一个多对多的关系,我想通过限制 Address.IsMailingAddress 返回一个 Player 及其邮寄地址。在 where 子句中限制 IsMailingAddress 不会返回没有邮寄地址(或根本没有地址)的记录,因此我需要在联接中限制它。下面的代码被简化了,我不能用HQL。
查询:
var target = session.CreateCriteria<Player>()
.SetProjection(Projections.Property("PlayerId"))
.CreateAlias("Addresses", "ad", JoinType.LeftOuterJoin, Restrictions.Eq("ad.IsMailingAddress", true))
.Add(Restrictions.Eq("LastName", "Anonymous"))
.List();
生成 SQL:
SELECT this_.PlayerId as y0_
FROM dbo.VPlayerExisting this_
left outer join dbo.LinkPlayAddr addresses3_
on this_.PlayerId = addresses3_.PlayerId
and (ad1_.MailingAddressFlag = 1 /* @p0 */)
left outer join dbo.VAddress ad1_
on addresses3_.AddressId = ad1_.AddressId
and (ad1_.MailingAddressFlag = 'Anonymous' /* @p1 */)
WHERE this_.Name_Last = @p2
MailingAddressFlag(映射到 IsMailingAddress 的列)在不存在的多对多链接表中受到限制,并且 LastName 限制应用于地址表的联接。确实会发出查询,但数据库服务器当然会引发异常。
这是一个错误、不受支持还是我做错了?
【问题讨论】:
-
我认为这是一个错误,但我找到了一个简单的解决方法。 25分给第一个能见树不见林的人。提示:一个玩家可以链接到多个地址,但这些地址中只有一个是邮寄地址。
标签: nhibernate criteria criteria-api icriteria