Спецификация весны JPA с сортировкой
Я использую Spring JPA.
чтобы быть более точным, я использую репозиторий, который расширяет JpaRepository
и JpaSpecificationExecutor
потому что мне требуется разбиение на страницы, фильтрация и сортировка.
теперь у меня есть разбиение на страницы и фильтрация, все работает нормально, но я не могу заставить сортировку работать.
Я с некоторым разочарованием замечаю, что JpaSpecificationExecutor
и findAll()
методы:
findAll(Specification, Pageable);
findAll(Specification, Sort);
но тот, который мне нужен:
findAll(Specification, Pageable, Sort); //or something like this
не существовать!
Итак, план B, включает сортировку в спецификацию.
С помощью принятого ответа на этот вопрос:JpaSpecificationExecutor присоединиться + заказать в спецификации я собрал следующее:
private Specification<MainEntity> matches() {
return new Specification<MainEntity>() {
public Predicate toPredicate(Root<MainEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<Predicate>();
//Attempt to sort by Surname, has no effect
query.orderBy(cb.asc(root.get("surname")));
//add string filters
for (String field : stringFilterMap.keySet()) {
String valuePattern = stringFilterMap.get(field);
predicates.add(cb.like(root.get(field), "%"+valuePattern+"%"));
}
//...snip...
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
}
здесь springFilterMap
является полем экземпляра,Map<String,String>
чьи ключи являются именами полей, а значения-значениями фильтров.
выше вы увидите мою попытку заказать по фамилии, но у этого, похоже, нет эффект.
что я делаю неправильно; & как я могу достичь сортировки вместе с разбиением на страницы и фильтрацией?
1 ответов
использовать PageRequest, что является реализацией Pageable, и реализует пейджинг и сортировку сразу, как вы этого хотите. Например, через этот конструктор:
public PageRequest(int page, int size, Sort sort)
обновление: Поскольку Spring Data JPA 2.0 вышеуказанный конструктор устарел, и вы должны использовать статический заводской метод of:
public static PageRequest of(int page, int size, Sort sort)