Spring JPA - получение всех сущностей, которые имеют любой из столбцов дат X в диапазоне - PullRequest
0 голосов
/ 05 августа 2020

У меня есть объект Organization, который расширяется от AbstractEntity, который предоставляет ему три столбца даты: createdAt, updatedAt и checkedAt. ',' updatedAt 'или' checkedAt ', которые прекрасно работают, но я попытался создать метод запроса, который проверяет все три столбца одновременно, и он прерывает сборку парой java .lang.IllegalStateException в PartTreeJpaQuery. java: 161 исключение.

@Repository
public interface OrganizationRepository extends JpaRepository<Organization, String>{

  List<Organization> findByParentOrganizationIsNull();

  Optional<Organization> findByExternalId(String id);

  List<Organization> findByCreatedAtBetween(LocalDateTime start, LocalDateTime end);
  List<Organization> findByUpdatedAtBetween(LocalDateTime start, LocalDateTime end);
  List<Organization> findByCheckedAtBetween(LocalDateTime start, LocalDateTime end);
  // THIS LAST ONE DOESN'T WORK
  List<Organization> findByCreatedAtBetweenOrUpdatedAtBetweenOrCheckedAtBetween(LocalDateTime start, LocalDateTime end);

}

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

1 Ответ

0 голосов
/ 05 августа 2020
List<Organization> findByCreatedAtBetweenOrUpdatedAtBetweenOrCheckedAtBetween(LocalDateTime start, LocalDateTime end);

или, альтернативно,

List<Organization> findByCreatedAtOrUpdatedAtOrCheckedAtBetween(LocalDateTime start, LocalDateTime end);

Не работают, насколько я понимаю сейчас, потому что начальные и конечные параметры используются каждым Between, поэтому следующие не знают, что параметры для использования. См. Как объединить несколько запросов по дате между поисками с CrudRepository из Spring Data JPA?

Решением было создание обычного @Query со столбцом между столбцом ИЛИ между столбцом ИЛИ между ними, который использует оба параметры несколько раз.

@Query("select o from Organization o " +
        "where o.createdAt between ?1 and ?2 " +
        "or o.updatedAt between ?1 and ?2 " +
        "or o.checkedAt between ?1 and ?2")
List<Organization> findByAnyDateBetween(LocalDateTime start, LocalDateTime end);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...