Присоединиться к таблице с определенным условием

#postgresql #hibernate

#postgresql #спящий режим

Вопрос:

У меня есть три таблицы: «пользователь», с которым связана одна или несколько строк в таблице «contractYear», которая состоит из строк в таблице «contract_month».

Я хочу получить результирующий набор пользователей, у которых нет месяцев контракта на текущий контрактный год (т. Е. Контрактный год.EndDate < текущая дата)

Я сделал следующий запрос:

 @Query("select distinct u "
          " from User u "
          " left join u.contractYears cy"
          " on cy.endDate < now()"
          " left join cy.contractMonths cm"
          " where cm is null")
  

Но это не работает…

Я предполагаю, что условие "on cy.endDate < now()" неверно.

Может быть, кто-нибудь может помочь мне составить правильный запрос?

Комментарии:

1. Но это не работает … вы получаете неправильные результаты или ошибку?

2. @M Khalid Junaid, я получаю неверный результат: я получаю всех пользователей, у которых есть текущий год контракта. Я предполагаю, что условие «где cm равно нулю» игнорируется.

3. user является зарезервированным именем в Postgres. Лучше не использовать его в качестве идентификатора (таблицы или столбца).

4. Я прошу прощения за то, что забыл об этом. В реальном случае моя таблица называется немного по-другому. я использовал имя «пользователь» только для примера

Ответ №1:

В HQL, если вам нужен дополнительный фильтр в предложении join, вы можете добавить, используя WITH ключевое слово

 select distinct u 
from User u 
left join u.contractYears cy
     with cy.endDate < now()
left join cy.contractMonths cm
where cm is null
  

Смотрите раздел 14.3. Ассоциации и объединения