Проверка даты между двумя другими датами spring data jpa

#java #spring #spring-data-jpa #spring-repositories

#java #весна #spring-data-jpa #spring-репозитории

Вопрос:

У меня есть эта модель:

 public class Event {
    private String name;
    private Date start;
    private Date end;
}
  

и репозиторий как

 @Repository
public interface EventRepository extends JpaRepository<Event, Long> {
    List<Event> findByEventTypeAccount(Account account);
}
  

Что я хочу сделать, так это передать одну дату, и мне нужно проверить, что дата находится между start и end , например (я передам 30 сентября в качестве даты и мне нужно найти все записи, которые имеют 30 сентября между их start и end )

Что-то вроде findDateisBetweenStartAndEnd(Date date) ?

Комментарии:

1. Вы должны взглянуть на справочную документацию: docs.spring.io/spring-data/jpa/docs/current/reference/html /. … Это хорошо объяснено.

Ответ №1:

Вы должны взглянуть на справочную документацию. Это хорошо объяснено.

В вашем случае, я думаю, вы не можете использовать between, потому что вам нужно передать два параметра

Между — findByStartDateBetween … где x.StartDate между ?1 и ?2

В вашем случае попробуйте использовать комбинацию LessThan or LessThanEqual с GreaterThan or GreaterThanEqual

  • LessThan / LessThanEqual

LessThan — findByEndLessThan … где x.start< ?1

LessThanEqual findByEndLessThanEqual … где x.start <= ?1

  • Больше, чем / больше, чем равно

Больше, чем — findbystart больше, чем … где x.end> ?1

GreaterThanEqual — findByStartGreaterThanEqual … где x.end>= ?1

Вы можете использовать оператор And и Or для объединения обоих.

Комментарии:

1. Привет, будет ли это возможно со строковыми значениями? Так, например, с таблицей лиц и выберите все между lastname = «abcd» и lastname = «efgh»

2. @Pau Разве имена методов не должны быть findByStartLessThanEqual and findByStartGreaterThanEqual , чтобы они соответствовали JPQL (т.Е. where x.start <= ?1 and where x.end >= ?1 )?

3. не могли бы вы сказать мне, какой формат даты вы передаете от клиента к контроллеру вызова метода findDateisBetweenStartAndEnd?? Я застрял с частью форматирования, когда отправлял запрос через клиент для конечной точки.

4. как добавить условие where к другому атрибуту? между и где вместе в одном запросе в spring data jpa?

Ответ №2:

Я использовал следующее решение для этого:

 findAllByStartDateLessThanEqualAndEndDateGreaterThanEqual(OffsetDateTime endDate, OffsetDateTime startDate);
  

Комментарии:

1. Вы, пожалуйста, добавьте небольшое (более подробное) объяснение?

2. но для этого вы должны передать две даты — начальную и конечную, я думаю, это правильный подход

3. Порядок колясок неправильный. Во-первых, параметр связан с StartDate, а не с EndDate

4. @JordanSilva , порядок параметров правильный, поскольку он проверяет, пересекается ли один период с другим, но не является ли другой период полностью внутри контрольного периода.

5. В этом случае вместо того, чтобы использовать этот метод слишком долго, используйте аннотацию @query, это более полезно для определения вашего кода, ваш режим работает, просто совет.

Ответ №3:

Вы также можете написать пользовательский запрос с помощью @Query

 @Query(value = "from EntityClassTable t where yourDate BETWEEN :startDate AND :endDate")
public List<EntityClassTable> getAllBetweenDates(@Param("startDate")Date startDate,@Param("endDate")Date endDate);
  

Редактировать: для LocalDateTime я только что попробовал это решение для фильтрации записей на основе даты и типа в spring JPA:

 Page<MyEntity> findMyEntityByEntityDateBetweenAndType(
            @Param("startDate") LocalDateTime startDate,
            @Param("endDate") LocalDateTime endDate, @Param("type") String type, Pageable pageable);
  

Здесь EntityDate может быть как CreatedDate, ModifiedDate и т.д.

Комментарии:

1. как он будет обрабатывать нулевую начальную и конечную дату?

Ответ №4:

Может быть, вы могли бы попробовать

List<Article> findAllByPublicationDate(Date publicationDate);

Подробности можно проверить в этой статье:

https://www.baeldung.com/spring-data-jpa-query-by-date

Комментарии:

1. Это комбинация необъяснимого кода и ссылки. Пожалуйста, добавьте объяснение того, как работает код и как он должен решить проблему. Без такого объяснения ваш пост распространяет ошибочное представление о том, что StackOverflow — это платформа для распространения непрограммной работы по программированию. Связывание извне не считается таким объяснением. Ответ только по ссылке может быть удален.

Ответ №5:

Вы можете использовать JpaRepository

 List<Entity> findByColumnDateBetween(LocalDateTime to, LocalDateTime from);
  

Комментарии:

1. почему в обратном порядке (to,from) вместо (from,to) ?

2. @Ranjithkumar может быть, потому, что некоторые люди любят танцевать лунную походку 😉