2015-11-11 3 views
9

У меня есть простая служба REST, которая получает данные с загрузкой Spring CrudRepository.Фильтрация данных с помощью Spring Boot CrudRepository

Это хранилище уже реализует пагинацию и возможности сортировки, как это:

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

Calling его:

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

return flightRepo.findAll(page); 

Я хотел бы также добавить фильтрацию в этом хранилище (например, возвращать только объекты с id > 13 AND id < 27). CrudRepository, похоже, не поддерживает эту функциональность. Есть ли способ достичь этого или мне нужно использовать другой подход?

Спасибо за любые советы!

ответ

7

Альтернатива, которая будет учитывать вашу озабоченность в комментариях выше о необходимости создания методов запроса для каждой комбинации параметров, заключается в использовании шаблона Specification через API критериев или используя QueryDSL.

Оба подхода изложены в ниже в ответ на озабоченность, что:

число методов запроса может расти для больших приложений, потому что из - и это вторая точка - запросы определяют фиксированный набор из критериев. Чтобы избежать этих двух недостатков, не было бы здорово, если бы вы могли придумать набор атомных предикатов, которые вы могли бы комбинировать динамически, чтобы построить свой запрос?

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

Я нахожу QueryDSL немного легче работать. Вам нужно определить только один метод интерфейса, который затем можно передать любой комбинации параметров в качестве предиката.

например.

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

и запрос:

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

где Quser является 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

Update

С выпуском Гослинг модуля Spring Data есть теперь поддержка автоматической генерации предиката из параметров HTTP в веб-приложении.

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

0

Объявите ниже функцию в хранилище [EDITED]

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

Затем вы можете вызвать эту функцию из экземпляра репозитория. Пожалуйста, обратитесь к spring-data reference для получения дополнительной информации ..

+0

Может ли это быть объединено с страницей? Я надеялся, что могу указать это в каком-то объекте и передать его функции. Это не очень удобно, когда вы нуждаетесь в некоторой гибкости (пользователь может указать настраиваемое поле для фильтрации, и мне нужно будет указать такую ​​функцию для каждой возможной комбинации ...) – Smajl

+0

да, вы можете использовать simpy 'List findByIdBetween (Long start , Long end, pageable pageable) ' – pezetem

+0

также рекомендуем вам изменить расширенный интерфейс на' PagingAndSortingRepository'. –

Смежные вопросы