2011-07-01 66 views
0

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列),其中它沒有在許多一對多連接表被限制存在並且姓氏限制應用於地址表的連接。查詢確實發佈了,但是數據庫服務器當然會引發異常。

這是一個錯誤,不支持或我做錯了嗎?

+0

我認爲這是一個錯誤,但我找到了一個簡單的解決方法。 25分給第一個能看到樹林的人。提示:玩家可以鏈接到多個地址,但只有其中一個地址是郵寄地址。 –

回答

1
var target = session.CreateCriteria<Player>() 
    .CreateAlias("Addresses", "ad", JoinType.InnerJoin) 
    .Add(Restrictions.Eq("LastName", "Anonymous")) 
    .Add(Restrictions.Eq("ad.IsMailingAddress",true)) 
    .List(); 

只是內部加入郵件地址的限制IsMailingAddress?

應該帶回玩家(其姓氏是「匿名」)與他們的MailingAddress,他們有一個地址,並且該地址被標記爲IsMailingAddress。

+0

如果沒有地址或沒有設置IsMailingAddress地址,則不返回播放器。第一個問題(無行)很容易用左連接解決,第二個問題更困難。目標是如果玩家存在郵寄地址,則返回玩家地址,否則返回玩家地址爲空的地址。 –

+0

玩家是否只有一個未被標記爲郵寄地址的地址? –

+0

任何機會,你可以回答自己的問題,所以我可以理解你的解決方法? –

0

解決方案如下。應該只有一個IsMailingAddress地址集,所以or條件允許連接成功,如果有一個或沒有使用內部連接。

var target = session.CreateCriteria<Player>() 
    .SetProjection(Projections.Property("PlayerId")) 
    .CreateAlias("Addresses", "ad", JoinType.InnerJoin) 
    .Add(RestrictionsOr(Restrictions.Eq("ad.IsMailingAddress", true), Restrictions.IsNull("ad.AddressId"))) 
    .Add(Restrictions.Eq("LastName", "Anonymous")) 
    .List(); 
+0

你在用什麼數據庫?你可以發佈SQL嗎? –