web-dev-qa-db-ja.com

ソート付きSpring JPA仕様

Spring JPAを使用しています。

より正確には、ページネーション、フィルタリング、ソートが必要なため、JpaRepositoryJpaSpecificationExecutorを拡張するリポジトリを使用しています。

現在、ページネーションとフィルタリングはすべて正常に機能していますが、ソートを機能させることもできません。

JpaSpecificationExecutorfindAll()メソッドを持っていることに少し失望して気づきます:

findAll(Specification, Pageable);
findAll(Specification, Sort);

しかし、私が必要なもの:

findAll(Specification, Pageable, Sort); //or something like this

存在しない!

したがって、プランBでは、仕様に並べ替えを含めます。

この質問に対する受け入れられた回答の助けを借りて: JpaSpecificationExecutor JOIN + ORDER BY in Specification 私は以下をまとめました:

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>キーがフィールド名で、値がフィルター値です。

上に姓で注文する私の試みが表示されますが、これは効果がないようです。

私は何を間違えていますか。 &ページネーションとフィルタリングとともにソートを実現するにはどうすればよいですか?

13
NickJ

PageRequest を使用します。これは Pageable の実装であり、必要に応じてページングとソートを一度に実装します。たとえば、 this constructor

public PageRequest(int page, int size, Sort sort)

更新:Spring Data JPA 2.0以降、上記のコンストラクタは非推奨になりました。静的ファクトリメソッド of を使用する必要があります。

public static PageRequest of(int page, int size, Sort sort)
22
Robert Niestroj