2012-01-30 62 views
1

的HQL查詢:HQL翻譯成另一種NHibernate的查詢形式

from BusinessObject as businessobject 
    left outer join businessobject.BussinesPartner as businesspartner 
    left outer join businessobject.Document as document 
    left outer join businessobject.Group as group "; 
where businessobject.Date >= :datefrom and businessobject.Date <= :dateto 
    and (:filter = '' 
      or :filter is null 
      or businesspartner.Name like '%' || :filter || '%' 
      or group.Name like '%' || :filter || '%' 
      or document.Name like '%' || :filter || '%') 

我不想使用HQL。我也想要一個強類型的結果集合,而不使用不方便和雜亂的SetResultTransformer。我寧願使用查詢<>(),但我不知道如何強制外連接。

當我在查詢<>()窗體中編寫該窗體時,如果BusinessPartner爲空,它將不會返回日期處於正確範圍內的結果並且返回filter =「」。雖然「其中」邏輯表達式爲這些對象真實的,它看起來像他們不是在結果集反正因爲使用內部的連接:

session.Query<BusinessObject>() 
     .Where(x => 
      (x.Date >= criteria.DateFrom && x.Date <= criteria.DateTo 
      && (criteria.Filter == "" 
      || x.BusinessPartner.Name.Contains(criteria.Filter) 
      || x.Group.Name.Contains(criteria.Filter) 
      || x.Document.Name.Contains(criteria.Filter)))) 

這是不行的,因爲它有任何行將無法返回引用BusinessPartner,Group或Document的字段中的空值(表示內部聯接)。

是否有可能做什麼,我想查詢<>()?或與標準?

回答

1

我不知道關於查詢<>()但是通過ICriteria,您可以控制JOIN的類型並通過使用CreateAlias來獲取強類型結果。

ICriterion conjunction = Restrictions.Conjunction(); 
conjunction.Add(Restrictions.Contains(criteria.Filter),"BusinessPartner.Name"); 
conjunction.Add(Restrictions.Contains(criteria.Filter),"Group.Name"); 
conjunction.Add(Restrictions.Contains(criteria.Filter),"Document.Name"); 

ICriteria query = ICriteria.CreateCriteria 
.CreateAlias("BusinessPartner", "BusinessPartner", JoinType.LeftOuterJoin) 
.CreateAlias("Group", "Group", JoinType.LeftOuterJoin) 
.CreateAlias("Document", "Document", JoinType.LeftOuterJoin) 
.Add(Restrictions.Between(criteria.DateFrom,criteria.DateTo),"Date") 
.Add(conjunction)); 

List<BusinessObject> results = query.List<BusinessObject>(); 
+0

它可能需要一點重構,我不在我的辦公室。 – 2012-01-30 18:55:01

+0

這看起來可能會起作用(將在明天工作,我在這裏沒有DB)。但是,它通過不使用SetResultTransformer爲每個字段創建一個別名,然後通過寫出映射以不同的形式提供此信息,從而避免了這種情況。這就是爲什麼我更喜歡使用通用查詢,它使用映射自動將值分配到正確的字段。不過,我可能最終會這樣做,因爲我需要外部連接。 – svinja 2012-01-31 23:06:33