Hibernate JPA查询与生成的sql查询不同

Hibernate JPA查询与生成的sql查询不同,hibernate,spring-data-jpa,Hibernate,Spring Data Jpa,我在Spring存储库中有这个JPA查询定义 @Query(value="select rd.contractID as contractID, rd.gicCode as gicCode, count(rd) as ticketNo" + " from RawData rd" + " where rd.contractID is not null and ((rd.contractCostObject is null and rd.domestic = true

我在Spring存储库中有这个JPA查询定义

  @Query(value="select rd.contractID as contractID, rd.gicCode as gicCode, count(rd) as ticketNo" 
      + " from RawData rd" 
      + " where rd.contractID is not null and ((rd.contractCostObject is null and rd.domestic = true) or (rd.mirrorSVO is null and rd.domestic = false))"
      + " group by rd.contractID, rd.gicCode")
但生成的SQL查询就是这个

select
    rawdata0_.contractID as col_0_0_,
    rawdata0_.gicCode as col_1_0_,
    count(rawdata0_.id) as col_2_0_ 
from
    RawData rawdata0_ 
where
    (
        rawdata0_.contractID is not null
    ) 
    and (
        (
            rawdata0_.contractCostObject is null
        ) 
        and rawdata0_.domestic=true 
        or (
            rawdata0_.mirrorSVO is null
        ) 
        and rawdata0_.domestic=false
    ) 
group by
    rawdata0_.contractID ,
    rawdata0_.gicCode
正如您所看到的,括号已更改,我相信两个查询中的条件不相同。 是虫子吗?
在postgresql数据库中使用hibernate with spring。

和运算符的优先级高于
运算符

  • 条件A和条件B或条件C和条件D
相当于

  • (a和B)或(C和D)
将此规则应用于查询,实际结果类似于:

((rawdata0_.contractCostObject is null) and rawdata0_.domestic=true)
or 
((rawdata0_.mirrorSVO is null) and rawdata0_.domestic=false)

正是你想要的。JPA生成的查询是正确的。

和运算符的优先级高于
运算符

  • 条件A和条件B或条件C和条件D
相当于

  • (a和B)或(C和D)
将此规则应用于查询,实际结果类似于:

((rawdata0_.contractCostObject is null) and rawdata0_.domestic=true)
or 
((rawdata0_.mirrorSVO is null) and rawdata0_.domestic=false)
正是你想要的。JPA生成的查询是正确的