Java Hibernate:条件查询计算不正确

Java Hibernate:条件查询计算不正确,java,hibernate,ejbql,Java,Hibernate,Ejbql,我正在尝试使以下查询在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

我正在尝试使以下查询在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)
换句话说,它只返回满足
后的条件的对象,而忽略满足第一个条件的任何结果。如果删除
之后的条件,查询将正确地返回满足
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
是同一外国实体的不同实例。因此,我查询的表引用了单个外部表中的两个不同行。我怀疑这就是为什么必须进行自连接的原因(这也是我决定尝试自连接的原因),但我不确定这背后的确切原因是什么。欢迎任何解释。

在检查时看起来还可以。。。您可以尝试以下详细方法:

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

检查时看起来不错。。。您可以尝试以下详细方法:

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

为了解决这个问题,我最终不得不修改我的问题如下:

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提出的非常好的建议,但在我的具体案例中,它不起作用,我不得不使用自连接重写我的原始查询,以获得正确的结果

为了避开这个问题,我最终不得不修改我的查询,如下所示:

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提出的非常好的建议,但在我的具体案例中,它不起作用,我不得不使用自连接重写我的原始查询,以获得正确的结果

好主意,但不幸的是似乎不起作用。奇怪的是,这只会返回第一次查询的结果,而现在忽略了
orderby
。如果我单独尝试第二个查询,它可以正常工作。有没有可能是什么原因导致Hibernate在第一次查询后退出?也许值得注意的是,
obj1
obj2
都引用相同的外部实体类型(因此它们引用同一表中的不同行)。这会导致问题吗?我发现了一个可行的查询变体。但我还是想知道为什么。查看原始帖子了解详细信息。好主意,但不幸的是似乎不起作用。奇怪的是,这只会返回第一次查询的结果,而现在忽略了
orderby
。如果我单独尝试第二个查询,它可以正常工作。有没有可能是什么原因导致Hibernate在第一次查询后退出?也许值得注意的是,
obj1
obj2
都引用相同的外部实体类型(因此它们引用同一表中的不同行)。这会导致问题吗?我发现了一个可行的查询变体。但我还是想知道为什么。有关详细信息,请参阅原始帖子。