JPA - Возвращаемые объекты, которые после StartDate и Before EndDate
У меня есть две даты в моей сущности. то есть.
Date startDate;
Date endDate;
Как мне запросить, чтобы дать дату, он вернет все объекты, где указанная дата находится между startDate
и endDate
?
Я уже пробовал следующее:
findByStartDateAfterAndEndDateBefore(Date givenDate);
И Spring -Data-JPA не понравилось и ошибся. Нет никакой конкретной ошибки, и репо просто не может быть введено в мой класс.
Каков правильный путь? Я знаю, что это можно легко выполнить с помощью критериев Hibernate или с помощью Native SQL, но попытаться сделать это в Spring JPA.
Это проблема с самим запросом или какая-то несовместимость между типами даты Spring использует?
Пробовал findByStartDateAfterAndEndDateBefore(Date givenDate, Date givenDate)
и возвращает значение null.
Ответы
Ответ 1
Вы не можете использовать только один параметр из-за ограничений Spring Data, но вы можете обходить его с помощью следующего кода:
List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date startDate, Date endDate);
default List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date givenDate) {
return findByStartDateBeforeAndEndDateAfter(givenDate, givenDate);
}
Этот код должен охватывать ваши потребности. Я также проверил его с помощью Spring Boot 1.5.9. используя spring -data-get-started пример.
Ответ 2
К моему удивлению, LessThan
и GreaterThan
работают, а Before
и After
терпят неудачу.
Я никогда не думал, что могу использовать меньше и больше, чем для дат, и всегда смотреть на связанные с датой функции, как между, до, после.
Это в основном из-за примера документации
After
findByStartDateAfter
… where x.startDate > ?1
Before
findByStartDateBefore
… where x.startDate < ?1
Итак, я посмотрел более подробно в docs Spring Data JPA и нашел что-то интересное в приведенном ниже примере
LocalDate date = new LocalDate().minusYears(2);
return builder.lessThan(root.get(_Customer.createdAt), date);
Поэтому, сравнивая данные, авторы используют критерии LessThan
для свойства времени.
Таким образом, получил выстрел с меньшим, чем и работал, и снова дал выстрел больше, чем потом, а затем вместе. Поэтому я придумал заключение
public MyDateEntity findByStartDateLessThanAndEndDateGreaterThan(Date sDate, Date eDate);
И это работает до сих пор. И я верю, должен быть чистый способ обрабатывать даты, вероятно, с помощью before,after,between
, но я просто не могу понять это.
Было бы здорово, если бы кто-то понял это.
Ответ 3
Вы используете условие AND
в своем запросе JPA, но предоставляете только один параметр. Вы должны использовать как findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate);
Ответ 4
Поскольку вам нужен только объект Date в качестве эквивалента LocalDate, это должно сделать трюк.
default List<AnEntity> findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate) {
Calendar cal = Calendar.getInstance();
cal.setTime(endDate);
cal.add(Calendar.DATE, -1);
return findByStartDateBetween(startDate, cal.getTime());
}
Поскольку вы хотите, чтобы он включал начало, но не конец, а SQL BETWEEN
включен, мы просто переносим конец на один день назад.
Ответ 5
Public List<EntityClass> findData(Date startDate,Date endDate)
{
Query<EntityClass> _q = em.createQuery("select a.* from _tableName a
where a.startDate>= :d1 AND a.endDate<= :d2");
_q.setParameter("d1", startDate, TemporalType.DATE);
_q.setParameter("d2", endDate, TemporalType.DATE);
List<EntityClass> result = query.getResultList();
em.getTransaction().commit();
return result;
}
Ответ 6
Я использую его без каких-либо проблем:
findAllByEntityNotNullAndDateBetween(Date begin, Date end);
Вы уже пробовали?