web-dev-qa-db-fra.com

Filtrage des données avec Spring Boot CrudRepository

J'ai un simple service REST qui accède aux données avec Spring boot CrudRepository.

Ce référentiel implémente déjà des fonctionnalités de pagination et de tri telles que celles-ci:

public interface FlightRepository extends CrudRepository<Flight, Long> {
  List<Flight> findAll(Pageable pageable);
}

L'appelant:

Sort sort = new Sort(direction, ordering);
PageRequest page = new PageRequest(xoffset, xbase, sort);

return flightRepo.findAll(page);

Je voudrais ajouter également le filtrage à ce référentiel (par exemple, renvoyer uniquement les entités avec id > 13 AND id < 27). Le CrudRepository ne semble pas supporter cette fonctionnalité. Existe-t-il un moyen d'atteindre cet objectif ou dois-je utiliser une approche différente?

Merci pour tous les conseils!

10
Smajl

Une solution alternative, qui répondrait aux préoccupations exprimées dans les commentaires ci-dessus au sujet de la création de méthodes de requête pour chaque combinaison de paramètres, consiste à utiliser le modèle de spécification via l'API Criteria ou à l'aide de QueryDSL.

Les deux approches sont décrites ci-dessous en réponse à la préoccupation suivante:

le nombre de méthodes de requête peut augmenter pour les applications plus volumineuses, car (c’est le deuxième point), les requêtes définissent un ensemble fixe de critères. Pour éviter ces deux inconvénients, ça ne serait pas cool si vous pourrait proposer un ensemble de prédicats atomiques que vous pourriez combiner dynamiquement pour construire votre requête?

https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl/

Je trouve que QueryDSL est un peu plus facile à utiliser. Vous devez uniquement définir une méthode d'interface à laquelle vous pouvez ensuite transmettre toute combinaison de paramètres en tant que prédicat.

par exemple.

public interface UserRepository extends PagingAndSortingRepository<User, Long>, QueryDslPredicateExecutor<User> {
    public List<User> findAll(Predicate predicate);
}

et d'interroger:

repository.findAll(QUser.user.address.town.eq("Glasgow").and(QUser.user.gender.eq(Gender.M)));

repository.findAll(QUser.user.address.town.eq("Edinburgh"));

repository.findAll(QUser.user.foreName.eq("Jim"));

où QUser est une classe générée automatiquement par QueryDSL.

http://docs.spring.io/spring-data/jpa/docs/current/api/index.html?org/springframework/data/jpa/repository/support/QueryDslRepositorySupport.html

http://www.querydsl.com/static/querydsl/2.1.0/reference/html/ch02s02.html

Mettre à jour

Depuis la version Gosling du module Spring Data, la génération automatique de prédicats à partir de paramètres HTTP est désormais prise en charge dans une application Web.

https://spring.io/blog/2015/09/04/what-s-new-in-spring-data-release-gosling#querydsl-web-support

9
Alan Hay

Déclarez la fonction ci-dessous dans votre référentiel [EDITED]

Page<Flight> findByIdBetween(Long start, Long end, Pageable pageable)

Vous pouvez ensuite appeler cette fonction à partir de l'instance de référentiel. Veuillez vous référer à référence de données de ressort pour plus d'informations.

0
Jos Angel George