it-roy-ru.com

JPA - Возвращение сущностей, следующих после StartDate и Before EndDate

У меня есть две даты в моей сущности. то есть.

Date startDate;
Date endDate;

Как сделать запрос, чтобы при заданной дате он возвращал все сущности, в которых указанная дата лежит между startDate и endDate?

Я уже попробовал следующее:

findByStartDateAfterAndEndDateBefore(Date givenDate);

И Spring-Data-JPA не понравилось это и натолкнулся на ошибки. Конкретной ошибки нет, и репо просто не может быть введено в мой класс.

Какой правильный путь? Я знаю, что это легко сделать с помощью критериев Hibernate или с помощью Native SQL, но я пытаюсь сделать это в Spring JPA.

Это проблема с самим запросом или какая-то несовместимость типов Date, которые использует Spring?

Пробовал findByStartDateAfterAndEndDateBefore(Date givenDate, Date givenDate) и возвращает ноль однако.

17

Вы не можете использовать только один параметр из-за ограничений 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-Start .

10
Oleksandr Shpota

К моему удивлению, LessThan и GreaterThan работают, а Before и After плохо работают.

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

Это в основном из-за примера документации 

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

Поэтому я посмотрел более подробно на документы Spring Data JPA и нашел кое-что интересное в следующем примере 

 LocalDate date = new LocalDate().minusYears(2);
 return builder.lessThan(root.get(_Customer.createdAt), date);

Поэтому при сравнении данных времени авторы используют критерии lessthan для свойства time. 

Так что дали выстрел с «меньше» и «сработал» и снова дали выстрел с «больше, чем», а потом вместе Итак, я пришел к выводу 

public MyDateEntity findByStartDateLessThanAndEndDateGreaterThan(Date sDate, Date eDate); 

И это работает до сих пор. И я считаю, что должен быть чистый способ обработки дат, возможно, с помощью before,after,between, но я просто не могу этого понять. 

Было бы здорово, если бы кто-то понял это.

5
Suresh Atta

Вы используете условие AND в своем запросе JPA, но предоставляете только один параметр. Вы должны использовать как findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate);

2
Hiren

Поскольку вам нужен только объект 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 включительно, мы просто перенесем конец на один день назад.

2
coladict
    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;
   }
2
DHARMENDRA SINGH

Я использую его без проблем, как это:

findAllByEntityNotNullAndDateBetween(Date begin, Date end);

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

0
fabioresner