1

我试图让以下查询在 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"

没有自联接的相同查询不起作用。看似多余的括号也是如此。使用它们,它会返回不正确的结果。

所以现在我的问题是,为什么有必要以这种方式构造查询,包括自连接和“多余的”括号?

可能值得注意的是obj1obj2是同一外国实体的不同实例。所以我正在查询的表是在一个外部表中引用两个不同的行。我怀疑这就是为什么需要自加入的原因(这也是我决定尝试自加入的原因),但我不确定它背后的确切原因是什么。欢迎任何解释。

4

2 回答 2

1

检查时看起来不错...您可以尝试这种详细的方法:

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
                             ) 
union
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.obj2 IS NOT NULL 
                                  AND m.obj2.count > 0)
ORDER BY m.createDate DESC
于 2011-07-06T11:46:24.450 回答
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

我感谢 Randy 提出的非常好的建议,但在我的具体情况下它不起作用,我不得不使用自连接重写我的原始查询,以便得到正确的结果。

于 2011-07-10T10:08:22.693 回答