3
votes

Nom de requête de la méthode de référentiel Spring JPA entre

Je souhaite récupérer les enregistrements pour lesquels la date mise à jour ou créée se situe entre une plage de dates. La classe d'entité est comme ci-dessous:

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

Le référentiel dessus est ci-dessous:

@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;

}

Le problème est lorsque j'utilise ceci, je reçois ci-dessous erreur:

Causé par: java.lang.IllegalArgumentException: aucun paramètre disponible pour la pièce mise à jour BETWEEN (2): [IsBetween, Between] JAMAIS. à 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)


0 commentaires

3 Réponses :


0
votes

Écrivez la signature de la méthode findByCreatedBetweenOrUpdatedBetween comme ci-dessous.

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


0 commentaires

4
votes

Vous devez fournir 4 dates.

Deux premiers pour la création entre et deux pour la mise à jour entre:

public interface OrderRepository
    extends PagingAndSortingRepository<Order, String>, QuerydslPredicateExecutor<Order> {
  public Page<Order> findByCreatedBetweenOrUpdatedBetween(
           Date startDateCreated, Date endDateCreated
         , Date startDateUpdated, Date endDateUpdated
         , Pageable pageRequest);
}


4 commentaires

J'ai envisagé cette option, mais pour cela, je devrai passer chaque date deux fois. Cela semble un peu redondant. Y a-t-il de toute façon je peux passer juste 2 dates.


C'est ainsi que fonctionne le moteur. Il attend un paramètre a (ou défini dans ce cas) pour chaque mot clé utilisé.


@iCode, vous pouvez simplement ajouter une méthode par défaut à OrderRepository qui délègue à celle générée et prend soin de dupliquer les dates


Ou vous pouvez simplement définir la requête manuellement à l'aide de l'annotation @Query .



0
votes

La génération automatique convient pour les requêtes simples: dans ce cas, il est probablement plus facile de définir la requête manuellement, alors vous n'avez besoin que de 2 paramètres.

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 commentaires