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的字段中的空值(表示內部聯接)。
是否有可能做什麼,我想查詢<>()?或與標準?
它可能需要一點重構,我不在我的辦公室。 – 2012-01-30 18:55:01
這看起來可能會起作用(將在明天工作,我在這裏沒有DB)。但是,它通過不使用SetResultTransformer爲每個字段創建一個別名,然後通過寫出映射以不同的形式提供此信息,從而避免了這種情況。這就是爲什麼我更喜歡使用通用查詢,它使用映射自動將值分配到正確的字段。不過,我可能最終會這樣做,因爲我需要外部連接。 – svinja 2012-01-31 23:06:33