nhibernate - HQL:OR 子句返回更少的记录而不是更多的记录

标签 nhibernate hql

我有一个 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/

相关文章:

NHibernate/LINQ - 子集合上的聚合查询

NHibernate 还是 FluentNHibernate 还是 ActiveRecord?

java - 这个 HQL 有什么问题?缺少的逗号在哪里?

java - Hibernate加入具有父类(super class)属性的类

java - 如何将嵌套 SQL 转换为 HQL

sql - 跨多个表的NHibernate查询

c# - 在 nHibernate 中管理嵌套事务

nhibernate - nHibernate 是否需要延迟加载?

date - 与Hive中的add_months函数不一致?

hibernate - 如何在 hibernate 中编写 count(*) 查询