2009-10-23 53 views
2

我正在修改现有的HQL查询,它返回单个列而不是对象图,但现在我没有获取所需的所有行。NHibernate HQL连接不返回所有必需的行

关于当前架构下面几个事实:

  • 一种估计属于合同。
  • 合同的OwningDepartment属性可以为null。
  • 一个部门的ParentBusinessStream属性不能为空

这是查询:

select e.ID, e.StatusCode.ID, e.InputDate, e.ParentClient.Name, e.ParentContractLocation.ParentLocation.Description, e.Description, e.InternalRef, e.ExternalRef, e.TotalIncTax, e.TaxTotal, e.Closed, e.ViewedByClient, e.HelpdeskRef, e.ParentContract.Reference, d.ParentBusinessStream.Title, d.Name 
from Estimate e, Department d where (e.ParentContract.ID in (select cs.ParentContract.ID from ContractStaff cs 
where cs.ParentStaff.ID=:staffID)) and ((d.ID = e.ParentContract.OwningDepartment.ID) OR (d.ID is null)) order by e.ID 

不幸的是我的查询没有返回估计在父母合同不具有所属部门。相反,我希望相关字段仅为空。我尝试了一个左外连接,但得到了相同的结果。

任何帮助将非常感激。道歉,如果我做了一些愚蠢的事情。

干杯,

詹姆斯

回答

0

我想我已经工作了:d.ParentBusinessStream.Title一个隐含的内部连接,但由于d可以为空,它不正常工作。我改变了我的查询,以考虑到这一点

0

我发现,含左外不寻常的连接的查询是通过使用ISQLQuery使您可以访问到正确的SQL语法,以及一些HQL动力更好。

除此之外,你不提供映射文件,这通常是有帮助的

+0

嗨, 感谢您的答复。不幸的是,我并不热衷于使用SQL查询的想法,原因如下: - 我们的客户不一定要坚持某种类型的数据库,并可能在将来转移到另一种类型的数据库。 - 我发布的HQL查询很糟糕,因为它是。要在SQL中复制它,将会使得它更加复杂,因为内部连接必须手动完成。 由于我有一周休息时间,因此我无法在下周之前发布相关映射。 干杯, James – James 2009-10-27 19:39:08