2014-03-05 74 views
2

我試圖做出兩個Criterias的分離,但結果不是預期的。 我試圖獲得一個人的所有書籍(在他的個人圖書館或他的團隊的圖書館)。nHibernate分離預期行爲

第一標準://返回1

myBooks = session.CreateCriteria<Book>() 
       .CreateCriteria("Library") 
       .CreateAlias("Users", "usr") 
       .Add(Restrictions.Eq("usr.Id", myUserId)) 
       .List().Count; 

第二標準//返回1分

myTeamsBooks = session.CreateCriteria<Book>() 
       .CreateCriteria("Library") 
       .CreateAlias("Teams", "grp")   
       .Add(Restrictions.In("grp.Id", myTeamsIds)) 
       .List().Count; 

析取//預期2,返回0!

allMyBooks = session.CreateCriteria<Book>() 
       .CreateCriteria("Library") 
       .CreateAlias("Users", "usr") 
       .CreateAlias("Teams", "grp") 
       .Add(Restrictions.Disjunction() 
        .Add(Restrictions.Eq("usr.Id", myUserId)) 
        .Add(Restrictions.In("grp.Id", myTeamsIds)) 
       ) 
       .List().Count; 

我在分析中做錯了什麼? 我也試過.Add(Restrictions.Or(,結果相同。

任何幫助將不勝感激!

回答

2

這種情況下的問題將與JOIN類型有關。我們需要LEFT之一,但默認(未指定)INNER。所以,像這樣調整CreatAlias,並且應該返回正確的結果:

.CreateAlias("Users", "usr", JoinType.LeftOuterJoin) 
.CreateAlias("Teams", "grp", JoinType.LeftOuterJoin) 
+0

非常感謝! 試圖找到它在我看到的文檔不在主要文檔參考,但是在那裏! http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Criteria.html#createAlias(java.lang.String,java.lang.String) –