Paginação e classificação usando o Spring Data JPA

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.

Read more

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.

Read more

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:

  1. Crie ou obtenha um objetoPageRequest, que é uma implementação da interfacePageable

  2. 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.