我试图让以下查询在 Hibernate 中工作:
SELECT m FROM MyEntity m WHERE m.owner = :user
AND m.field1 IN (:field1Vals)
AND m.field2 IN (:field2Vals)
AND m.obj1 IS NOT NULL
AND (
m.obj1.count > 0
OR
(m.obj2 IS NOT NULL
AND m.obj2.count > 0)
)
ORDER BY m.createDate DESC
问题是,它似乎总是评估以下部分:
AND (
m.obj1.count > 0
OR
(m.obj2 IS NOT NULL
AND m.obj2.count > 0)
)
...作为:
AND (m.obj2 IS NOT NULL
AND m.obj2.count > 0)
换句话说,它只返回满足后面条件的对象OR
,而忽略任何满足第一个条件的结果。如果我删除 后面的条件OR
,则查询正确地带回满足m.obj1.count > 0
条件的对象。
我假设我在构建查询时犯了一些基本错误,但我不确定它可能是什么。有任何想法吗?
更新
我找到了一个可行的变体,它使用自连接并添加了一些多余的括号:
SELECT DISTINCT m FROM MyEntity m, MyEntity m2 WHERE m.owner = :user
AND m.field1 IN (:field1Vals)
AND m.field2 in (:field2Vals)
AND m.obj1 IS NOT NULL
AND (
(m.obj1.count > 0)
OR
(m2.obj2 IS NOT NULL
AND (m2.obj2.count > 0))
)
ORDER BY m.createDate DESC"
没有自联接的相同查询不起作用。看似多余的括号也是如此。使用它们,它会返回不正确的结果。
所以现在我的问题是,为什么有必要以这种方式构造查询,包括自连接和“多余的”括号?
可能值得注意的是obj1
和obj2
是同一外国实体的不同实例。所以我正在查询的表是在一个外部表中引用两个不同的行。我怀疑这就是为什么需要自加入的原因(这也是我决定尝试自加入的原因),但我不确定它背后的确切原因是什么。欢迎任何解释。