JPA-запрос отличается от сгенерированного SQL-запроса - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть это определение JPA-запроса в репозитории Spring

  @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

Как видите, скобки изменены, и я считаю,условия не совпадают в двух запросах.Это ошибка?использование hibernate с пружиной с базой данных postgresql.

1 Ответ

0 голосов
/ 22 февраля 2019

Оператор and имеет приоритет над оператором or.

  • условие 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, правильный.

...