Ах, это действительно классика в JPA.
Следующий ответ, который я предоставляю - я не могу объяснить точно , почему это работает, но я могу решить это для вас
Краткий ответ , попробуйте:
SELECT s FROM Schedule as s LEFT JOIN s.reservations as r WHERE
(r.resDate is null or r.resDate = :planningDate) order by s.startHour
(ключ здесь - часть "r.resDate is null")
Длинный ответ :
Говорят, что люди, работающие в спящем режиме / JPA, явно не работают, но это работает. Сгенерированный SQL также довольно эффективен. Если кто-нибудь может объяснить, почему это работает, я буду очень впечатлен. Я выучил эту модель много лет назад, но не могу на всю жизнь вспомнить, где.
Одно примечание: есть один случай, когда это не сработает, и это в случае, когда нет резервирований для этого расписания. В этом случае единственный ответ, который я могу дать, состоит в том, что вы можете заключить свой запрос в попытку / перехват для «NoResultException» и выполнить запрос снова без предложения where (очевидно, если нет никаких резервирований, то нет резервирований с resDate на planningDate)