Hibernate Java 在 SQL 中重新排列括号

tri*_*rix 5 java hibernate jpql

我有一个@NamedQuery这样的

select i from MyTable i 
where 
(i.streetId = :streetId and i.cityId = :cityId) 
or 
(i.streetId is null and i.cityId = :cityId) 
or 
(i.streetId = :streetId and i.cityId is null)
Run Code Online (Sandbox Code Playgroud)

不知何故,Hibernate 将括号重新排列为

Hibernate: 
    select
        mytable0_.id as id1_14_,
        mytable0_.version as version2_14_,
        mytable0_.streetId as streetI3_14_,       
        mytable0_.cityId as cityId7_14_ 
    from
        myTable mytable0_ 
    where
        mytable0_.streetId=? 
        and mytable0_.cityId=? 
        or (
            mytable0_.streetId is null
        ) 
        and mytable0_.cityId=? 
        or mytable0_.streetId=? 
        and (
            mytable0_.cityId is null
        )
Run Code Online (Sandbox Code Playgroud)

为什么要这样做?(它们可能是等价的,但我更喜欢更简单的 where 子句)

当前的解决方法是用本机 SQL 编写它,但我只是想知道这是否是一个已知问题。

小智 7

由于在 SQL 查询执行中“AND”操作比“OR”操作具有更高的优先级,因此 hibernate 删除了不必要的大括号,使得 hiberante 查询生成的结果与命名查询返回的结果相同。例如:在 SQL 执行中:

A 和 B 或 C 和 D 或 E 和 F == (A 和 B) 或 (C 和 D) 或 (E 和 F)。

  • 但如果我想做 A 和(B 或 C 或 D)怎么办?Hibernate会强制它进入(A和B)或C或D? (7认同)