Спецификация весны 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)