SQL-запрос с JpaRepository: как фильтровать LocalDateTime только на основе года, месяца и дня? - PullRequest
2 голосов
/ 13 мая 2019

У меня есть право «Показать», в котором есть переменная LocalDateTime с именем «start»:

public class Show {
    //--other code---
    @Column(nullable = false)
    private LocalDateTime start;
    //--other code---
}

Я хочу выбирать из своей БД только на основе года, месяца и дня, игнорируя часы и минуты.

Мой текущий запрос:

@Query(value = "SELECT * FROM show s WHERE s.event_id = :eventId 
AND DATEPART(year, s.start) = DATEPART(year, :dateSearch) 
AND DATEPART(month, s.start) = DATEPART(month, :dateSearch) 
AND DATEPART(day, s.start) = DATEPART(day, :dateSearch)", nativeQuery = true)
Page<Show> findAllFiltered(@Param("eventId") Long eventId, @Param("dateSearch") LocalDateTime dateSearch, Pageable page);

Когда я пытаюсь выполнить этот запрос, я получаю код ошибки 500 со следующим сообщением:

"можетне подготовить оператор; вложенное исключение: org.hibernate.exception.GenericJDBCException: не удалось подготовить оператор "

edit: сделал запрос в блоке кода более легким для чтения

1 Ответ

0 голосов
/ 13 мая 2019

Я бы посоветовал вам перейти на использование диапазона даты / времени вместо одного значения. Это также будет работать лучше в запросе, если таблица будет иметь индекс на event_id, start

Примерно так:

@Query(value = "SELECT *" +
                " FROM show s" +
               " WHERE s.event_id = :eventId" +
                 " AND s.start >= :startDate" +
                 " AND s.start < :endDate", nativeQuery = true)
Page<Show> findAllFiltered(@Param("eventId") Long eventId,
                           @Param("startDate") LocalDateTime startDate,
                           @Param("endDate") LocalDateTime endDate,
                           Pageable page);

Обратите внимание, что endDate является эксклюзивным, как это обычно делается со всеми операциями диапазона в Java.

Затем вы можете добавить вспомогательный метод, если хотите:

Page<Show> findAllFiltered(@Param("eventId") Long eventId,
                           @Param("dateSearch") LocalDateTime dateSearch,
                           Pageable page) {
    LocalDateTime startDate = dateSearch.truncatedTo(ChronoUnit.DAYS);
    LocalDateTime endDate = startDate.plusDays(1);
    return findAllFiltered(eventId, startDate, endDate, page);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...