HQL:OR 子句返回较少的记录而不是更多
HQL: OR clause returning less records rather than more
我有一个 Employee 模型,它有一个 Manager 字段,该字段可以为空,也可以指向另一个 Employee。
我正在尝试 运行 一个查询,该查询将拉回层次结构中位于某个经理之下的员工列表。所以我从以下 WHERE 子句开始:
(e.Manager.Id = :managerId or
(e.Manager is not null and e.Manager.Manager.Id = :managerId))
这似乎工作正常,返回 Employees who's manager is the specified manager,或者谁的经理由指定的经理管理。
我试着把它提升到一个新的水平:
(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
如果没有显式 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)
通过这种方式生成的查询是可预测的,并且更容易理解问题出在哪里。
我有一个 Employee 模型,它有一个 Manager 字段,该字段可以为空,也可以指向另一个 Employee。
我正在尝试 运行 一个查询,该查询将拉回层次结构中位于某个经理之下的员工列表。所以我从以下 WHERE 子句开始:
(e.Manager.Id = :managerId or
(e.Manager is not null and e.Manager.Manager.Id = :managerId))
这似乎工作正常,返回 Employees who's manager is the specified manager,或者谁的经理由指定的经理管理。
我试着把它提升到一个新的水平:
(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如果没有显式 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)
通过这种方式生成的查询是可预测的,并且更容易理解问题出在哪里。