Paginação e classificação usando o Spring Data JPA
1. Visão geral
A paginação geralmente é útil quando temos um grande conjunto de dados e queremos apresentá-lo ao usuário em partes menores.
Além disso, geralmente precisamos classificar esses dados de acordo com alguns critérios durante a paginação.
Neste tutorial,we’ll learn how to easily paginate and sort using Spring Data JPA.
Leitura adicional:
Dados da Primavera JPA @Query
Aprenda a usar a anotação @Query no Spring Data JPA para definir consultas personalizadas usando JPQL e SQL nativo.
Métodos de consulta derivados em repositórios JPA de dados de primavera
Explore o mecanismo de derivação de consulta no Spring Data JPA.
2. Configuração inicial
Primeiro, digamos que temos uma entidadeProduct:
@Entity
public class Product {
@Id
private long id;
private String name;
private double price;
// constructors, getters and setters
}
como nossa classe de domínio. Cada uma de nossas instânciasProduct tem um identificador único -id, seunamee seuprice associados a ele.
3. Criando um Repositório
Para acessar nossoProducts, precisaremos de umProductRepository:
public interface ProductRepository extends PagingAndSortingRepository {
List findAllByPrice(double price, Pageable pageable);
}
Fazendo com que estendaPagingAndSortingRepository, we get findAll(Pageable pageable) and findAll(Sort sort) methods for paging and sorting.
Ou poderíamos ter escolhido estenderJpaRepository, já que estendePagingAndSortingRepository também.
Uma vez que estendemosPagingAndSortingRepository,we can add our own methods that take Pageable and Sort as parameters, como fizemos aqui comfindAllByPrice.
Vamos dar uma olhada em como paginar nossoProducts usando nosso novo método.
4. Paginação
Assim que tivermos nosso repositório estendendo-se dePagingAndSortingRepository, só precisamos:
-
Crie ou obtenha um objetoPageRequest, que é uma implementação da interfacePageable
-
Passe o objetoPageRequest como um argumento para o método de repositório que pretendemos usar
Podemos criar um objetoPageRequest passando o número da página solicitada e o tamanho da página.
Aqui,the page counts starts at zero:
Pageable firstPageWithTwoElements = PageRequest.of(0, 2);
Pageable secondPageWithFiveElements = PageRequest.of(1, 5);
No Spring MVC, também podemos escolher obter a instânciaPageable em nosso controlador usandoSpring Data Web Support.
Assim que tivermos nosso objetoPageRequest \, podemos passá-lo enquanto invocamos o método do nosso repositório:
Page allProducts = productRepository.findAll(firstPageWithTwoElements);
List allTenDollarProducts =
productRepository.findAllByPrice(10, secondPageWithFiveElements);
O métodofindAll(Pageable pageable) por padrão retorna um objetoPage<T>.
No entanto,we can choose to return either a Page<T>, a Slice<T> or a List<T> from any of our custom methods returning a paginated data.
Uma instânciaPage<T>, além de ter a lista deProducts, também sabe sobre o número total de páginas disponíveis. It triggers an additional count query to achieve it. To avoid such an overhead cost, we can instead return a Slice<T> or a List<T>.
ASlice só sabe se a próxima fatia está disponível ou não.
5. Paginação e Classificação
Da mesma forma, para apenas ter os resultados da consulta classificados, podemos simplesmentepass an instance of Sort para o método:
Page allProductsSortedByName = productRepository.findAll(Sort.by("name"));
No entanto, e se quisermosboth sort and page our data?
Podemos fazer isso passando os detalhes de classificação para nosso próprio objetoPageRequest:
Pageable sortedByName =
PageRequest.of(0, 3, Sort.by("name"));
Pageable sortedByPriceDesc =
PageRequest.of(0, 3, Sort.by("price").descending());
Pageable sortedByPriceDescNameAsc =
PageRequest.of(0, 5, Sort.by("price").descending().and(Sort.by("name")));
Com base em nossos requisitos de classificação,we can specify the sort fields and the sort direction ao criar nossa instânciaPageRequest.
Como de costume, podemos então passar esta instância do tipoPageable para o método do repositório.
6. Conclusão
Neste artigo, aprendemos como paginar e classificar nossos resultados de consulta no Spring Data JPA.
Como sempre, os exemplos de código completos usados neste tutorial estão disponíveisover on Github.