NHibernate 3 introduced the With clause。我試圖用它來限制多對多關係上的連接,並且NHibernate將附加連接限制應用於鏈接表而不是正確的表。Criteria API對於Criteria API,在多對多關係中使用子句
我在玩家和地址之間有多對多的關係,我想通過限制Address.IsMailingAddress來返回玩家及其郵寄地址。在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列),其中它沒有在許多一對多連接表被限制存在並且姓氏限制應用於地址表的連接。查詢確實發佈了,但是數據庫服務器當然會引發異常。
這是一個錯誤,不支持或我做錯了嗎?
我認爲這是一個錯誤,但我找到了一個簡單的解決方法。 25分給第一個能看到樹林的人。提示:玩家可以鏈接到多個地址,但只有其中一個地址是郵寄地址。 –