2015-11-11 7 views
9

Ho un semplice servizio REST che accede ai dati con l'avvio a molla CrudRepository.Filtraggio dei dati con avvio a molla CrudRepository

Questo repository implementa già impaginazione e funzionalità di ordinamento come questo:

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

Chiamarlo:

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

return flightRepo.findAll(page); 

vorrei aggiungere anche il filtraggio a questo repository (ad esempio restituire solo soggetti con id > 13 AND id < 27). Il CrudRepository non sembra supportare questa funzionalità. C'è un modo per ottenere questo o devo usare un approccio diverso?

Grazie per eventuali suggerimenti!

risposta

7

Un'alternativa, che risolverebbe la vostra preoccupazione nei commenti precedenti sulla necessità di creare metodi di query per ogni combinazione di parametri, è utilizzare il modello di specifica tramite l'API Criteri o usando QueryDSL.

Entrambi gli approcci sono descritti in seguito, in risposta alla preoccupazione che:

il numero di metodi di query potrebbero crescere per le più grandi applicazioni a causa di - e questo è il secondo punto - le query definiscono un insieme fisso dei criteri . Per evitare questi due inconvenienti, non sarebbe bello se tu potessi creare un insieme di predicati atomici con per combinare in modo dinamico per creare la tua query?

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

trovo QueryDSL un po 'più facile da lavorare. È necessario solo definire un metodo di interfaccia che è quindi possibile passare qualsiasi combinazione di parametri come un predicato.

ad es.

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

e interrogare:

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")); 

dove QUSER è una classe generata automaticamente 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

Aggiornamento

Dal rilascio Gosling del modulo primavera dati v'è ora il supporto per la generazione automatica dei predicati dai parametri HTTP in un'applicazione web.

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

0

dichiarare la funzione qui sotto nella tua repository [EDITED]

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

Quindi è possibile richiamare questa funzione dall'istanza di repository. Si prega di fare riferimento allo spring-data reference per ulteriori informazioni.

+0

Questo potrebbe essere combinato con il paginabile? Speravo di poterlo specificare in qualche oggetto e passarlo alla funzione. Questo non è molto utile quando si desidera una certa flessibilità (l'utente può specificare un campo personalizzato per essere filtrato e dovrò specificare una funzione come questa per ogni combinazione possibile ...) – Smajl

+0

sì, è possibile usare 'Lista findByIdBetween (Long start , Long-end, pageable pageable) ' – pezetem

+0

consiglia inoltre di modificare l'interfaccia estesa a' PagingAndSortingRepository' .. –