Nhibernate HQL:OR子句返回的记录较少而不是较多

Nhibernate HQL:OR子句返回的记录较少而不是较多,nhibernate,hql,Nhibernate,Hql,我有一个Employee模型,其中的Manager字段可以为null,也可以指向另一个Employee 我正在尝试运行一个查询,该查询将撤回位于层次结构中某个经理之下的员工列表。因此,我从以下WHERE子句开始: (e.Manager.Id = :managerId or (e.Manager is not null and e.Manager.Manager.Id = :managerId)) 这似乎很好,返回的员工谁的经理是指定的经理,谁的经理是由指定的经理管理的 我尝试将其提升到下

我有一个Employee模型,其中的Manager字段可以为null,也可以指向另一个Employee

我正在尝试运行一个查询,该查询将撤回位于层次结构中某个经理之下的员工列表。因此,我从以下WHERE子句开始:

(e.Manager.Id = :managerId or 
  (e.Manager is not null and e.Manager.Manager.Id = :managerId))
这似乎很好,返回的员工谁的经理是指定的经理,谁的经理是由指定的经理管理的

我尝试将其提升到下一个层次:

(e.Manager.Id = :managerId or 
  (e.Manager is not null and e.Manager.Manager.Id = :managerId) or 
  (e.Manager.Manager is not null and e.Manager.Manager.Manager.Id = :managerId))
这样,只有其经理由指定经理管理的员工才能返回。不返回由指定经理管理的员工


这怎么可能?当然,如果该子句的第一部分是匹配的(由指定的管理者管理),那么该子句的其余部分甚至不应该被评估

如果您没有比您在问题中提到的更多的管理级别,那么这个SQL语句应该可以工作

select e1.* from Employee e1 
left join Employee manager on e1.manager = manager.id
left join Employee bigManager on manager.manager = bigManager.id
where e1.manager = 3 or manager.manager = 3 or bigManager.manager = 3

3只是我在db中测试时使用的管理器id,没有显式连接,有时Hibernate会丢失,无法生成开发人员认为应该生成的查询

因此,一个好的实践总是明确你的连接(正如@Badzen所建议的)

我无法测试该查询,但请尝试:

Select e FROM Employee e
LEFT JOIN e.manager m1
LEFT JOIN m1.manager m2
LEFT JOIN m2.manager m3
WHERE m1.id = :managerId 
   or (m1 IS NOT NULL and m2.id = :managerId) 
   or (m2 IS NOT NULL and m3.id = :managerId) 

这样,生成的查询是可预测的,并且更容易理解问题出在哪里。

我将使用显式联接进行此查询。(如果e.Manager为null会发生什么?@BadZen您能给我一个您如何编写的示例吗?