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

Вы уже пробовали?