Estoy usando Spring JPA.
Para ser más precisos, estoy usando un Repositorio que extiende JpaRepository y JpaSpecificationExecutor porque necesito paginación, filtrado y clasificación.
Ahora tengo la paginación y el filtrado funcionando bien, pero no puedo hacer que la clasificación funcione también.
Observo con cierta decepción que JpaSpecificationExecutor tiene métodos findAll() :
findAll(Specification, Pageable); findAll(Specification, Sort);Pero el que necesito:
findAll(Specification, Pageable, Sort); //or something like this¡no existe!
Entonces, plan B, incluya la clasificación en la especificación.
Con la ayuda de la Respuesta aceptada a esta pregunta: JpaSpecificationExecutor JOIN + ORDER BY en Especificación , reuní lo siguiente:
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()])); } }; } Donde springFilterMap es un campo de instancia, Map<String,String> cuyas claves son nombres de campo y valores son valores de filtros.
Arriba verá mi intento de ordenar por Apellido, pero esto parece no tener efecto.
Qué estoy haciendo mal; y ¿cómo puedo lograr la clasificación junto con la paginación y el filtrado?
Use PageRequest , que es una implementación de Pageable , e implementa paginación y clasificación a la vez, como lo desee. Por ejemplo a través de este constructor :
public PageRequest(int page, int size, Sort sort)ACTUALIZACIÓN: desde Spring Data JPA 2.0, el constructor anterior está en desuso y debe usar el método de fábrica estático de :
public static PageRequest of(int page, int size, Sort sort)