HQL查询是:
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。我更喜欢使用Query&lt;&gt;(),但我不知道如何强制使用外连接。
当我在Query&lt;&gt;()表单中写这个时,它不会返回日期在正确范围内的结果和filter =&#34;&#34;例如,如果BusinessPartner为null。而&#34;其中&#34;对于这些对象,逻辑表达式是正确的,因为使用了内连接,它们看起来无论如何都不在结果集中:
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的字段中具有null的任何行(表示内部联接)。
是否可以使用Query&lt;&gt;()执行我想要的操作?或者使用Criteria?
答案 0 :(得分:1)
我不知道Query&lt;&gt;()但是使用Criteria可以控制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>();