#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
andfindByStartGreaterThanEqual
, чтобы они соответствовали JPQL (т.Е.where x.start <= ?1
andwhere 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);
Подробности можно проверить в этой статье:
Комментарии:
1. Это комбинация необъяснимого кода и ссылки. Пожалуйста, добавьте объяснение того, как работает код и как он должен решить проблему. Без такого объяснения ваш пост распространяет ошибочное представление о том, что StackOverflow — это платформа для распространения непрограммной работы по программированию. Связывание извне не считается таким объяснением. Ответ только по ссылке может быть удален.
Ответ №5:
Вы можете использовать JpaRepository
List<Entity> findByColumnDateBetween(LocalDateTime to, LocalDateTime from);
Комментарии:
1. почему в обратном порядке (to,from) вместо (from,to) ?
2. @Ranjithkumar может быть, потому, что некоторые люди любят танцевать лунную походку 😉