#java #sql #spring-boot #hibernate #spring-data-jpa
#java #sql #весенняя загрузка #гибернация #spring-data-jpa
Вопрос:
Я использую spring boot с гибернацией в своем проекте. Я хотел бы знать, возможно ли преобразовать дату и время в datetime / timestamp в запросе гибернации.
В чем проблема? У меня есть таблица `Term`:
id_term|date |time |id_appointment|accepted|
-------|----------|--------|--------------|--------|
45|2020-10-22|11:30:00| 6| 1|
4247|2020-10-19|19:00:00| 4| 1|
62648|2020-11-02|08:00:00| | 0|
62649|2020-11-02|08:30:00| | 0|
Как вы можете видеть, есть столбец date
и time
. Я хотел бы получить следующие 25 свободных терминов из текущего «datetime» (свободный термин означает id_appointment
, что значение равно НУЛЮ).
В настоящее время у меня есть запрос, подобный этому: SELECT TOP 25 * FROM Term WHERE id_appointment IS NULL AND time > :currentTime AND date > :currentDate
. Но это работает некорректно. Пример, если сейчас 2:15 вечера, а завтра у меня будет свободный срок с 11 утра до 4 вечера, этот запрос вернет мне свободные сроки только после 2:15 вечера. Я ищу решение, похожее на это: SELECT TOP 25 * FROM Term WHERE id_appointment IS NULL AND CAST(date time) > :currentDateTime
. Поля в Term
классе в Java LocalDate
LocalTime
— это переменные и .
Ответ №1:
Я решил свою проблему. Правильный ответ:
@Query(value = "SELECT TOP 20 * FROM term WHERE id_appointment IS NULL AND (CAST(date as datetime) CAST(time as datetime)) > :currentDateTime ORDER BY date ASC, time ASC", nativeQuery=true)
List<Term> getNext20FreeTerms(@Param("currentDateTime") LocalDateTime currentDateTime);
Ответ №2:
Приведенный выше ответ не полностью работает для меня. Я получал исключение в собственном запросе Hibernate — «несовместимые типы данных в сочетании в инструкции», мне пришлось включить пробел между датой и временем. Ну, я использую SQL Server. Вот обновленный запрос —
@Query(value = "SELECT TOP 20 * FROM term WHERE id_appointment IS NULL AND (CAST(date as datetime) ' ' CAST(time as datetime)) > :currentDateTime ORDER BY date ASC, time ASC", nativeQuery=true)
List<Term> getNext20FreeTerms(@Param("currentDateTime") LocalDateTime currentDateTime);