Имя запроса метода репозитория Spring JPA для между - PullRequest
0 голосов
/ 16 января 2019

Я хочу получить записи, для которых либо updated Дата, либо created Дата лежат между диапазонами дат. Класс сущности выглядит следующим образом:

@Entity
public class Order {

  @Id
  @Setter(AccessLevel.NONE)
  private String orderId;

  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "created_at", nullable = false)
  private Date created;

  @Temporal(TemporalType.TIMESTAMP)
  @Column(name = "updated_at", nullable = false)
  private Date updated;

}

Репозиторий на нем ниже:

public interface OrderRepository
    extends PagingAndSortingRepository<Order, String>, QuerydslPredicateExecutor<Order> {
  public Page<Order> findByCreatedBetweenOrUpdatedBetween(Date startDate, Date endDate,
      Pageable pageRequest);
}

Проблема, когда я использую это, я получаю ошибку ниже:

Причина: java.lang.IllegalArgumentException: параметр недоступен для части, обновленной МЕЖДУ (2): [IsBetween, Between] НИКОГДА. в org.springframework.util.Assert.isTrue (Assert.java:116) в org.springframework.data.jpa.repository.query.ParameterMetadataProvider.next (ParameterMetadataProvider.java:123) в org.springframework.data.jpa.repository.query.JpaQueryCreator $ PredicateBuilder.build (JpaQueryCreator.java:247) в org.springframework.data.jpa.repository.query.JpaQueryCreator.toPredicate (JpaQueryCreator.java:206) в org.springframework.data.jpa.repository.query.JpaQueryCreator.create (JpaQueryCreator.java:119) в org.springframework.data.jpa.repository.query.JpaQueryCreator.create (JpaQueryCreator.java:56)

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Вам необходимо предоставить 4 даты.

Первые два для создания между и вторые два для обновления между:

public interface OrderRepository
    extends PagingAndSortingRepository<Order, String>, QuerydslPredicateExecutor<Order> {
  public Page<Order> findByCreatedBetweenOrUpdatedBetween(
           Date startDateCreated, Date endDateCreated
         , Date startDateUpdated, Date endDateUpdated
         , Pageable pageRequest);
}
0 голосов
/ 17 января 2019

Автогенерация подходит для простых запросов: в этом случае, вероятно, проще просто определить запрос вручную, тогда вам нужно только 2 параметра.

public interface OrderRepository
    extends PagingAndSortingRepository<Order, String>, QuerydslPredicateExecutor<Order> {

  @Query("select o from Order o where (o.startDate between ?1 and ?2) " + 
            "or (o.updatedDate between ?1 and ?2)")
  public Page<Order> findByCreatedOrUpdatedBetween(Date startDate, Date endDate,
      Pageable pageRequest);
}
0 голосов
/ 16 января 2019

Напишите подпись метода findByCreatedBetweenOrUpdatedBetween, как показано ниже.

public interface OrderRepository
    extends PagingAndSortingRepository<Order, String>, QuerydslPredicateExecutor<Order> {
  public Page<Order> findByCreatedBetweenOrUpdatedBetween(Date startDate1, Date endDate1,
      Date startDate2, Date endDate2, Pageable pageRequest);
}
...