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)
3 Réponses :
É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); }
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); }
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
.
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); }