Преобразование даты и времени в DateTime в запросе гибернации

#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);