Spring JPAを使用しています。
より正確には、ページネーション、フィルタリング、ソートが必要なため、JpaRepository
とJpaSpecificationExecutor
を拡張するリポジトリを使用しています。
現在、ページネーションとフィルタリングはすべて正常に機能していますが、ソートを機能させることもできません。
JpaSpecificationExecutor
がfindAll()
メソッドを持っていることに少し失望して気づきます:
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>
キーがフィールド名で、値がフィルター値です。
上に姓で注文する私の試みが表示されますが、これは効果がないようです。
私は何を間違えていますか。 &ページネーションとフィルタリングとともにソートを実現するにはどうすればよいですか?
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)