我有一个 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))
然后,仅返回其经理由指定经理管理的员工。由指定经理管理的员工不会返回。
怎么会这样呢?当然,如果子句的第一部分是匹配的(由指定的管理器管理),那么子句的其余部分甚至不应该被评估?
最佳答案
如果没有显式 JOIN,有时 Hibernate 会迷失方向,无法生成开发人员认为应该生成的查询。
因此,一个好的做法是始终明确您的 JOIN(正如@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)
这样生成的查询是可预测的,并且更容易理解问题出在哪里。
关于nhibernate - HQL:OR 子句返回更少的记录而不是更多的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48914407/