Como fazer paginação de resultados no Spring Boot?

A paginação no Spring Boot permite otimizar consultas ao banco de dados, retornando dados de forma segmentada com Spring Data JPA e Pageable.

Como fazer paginação de resultados no Spring Boot?

A paginação no Spring Boot permite dividir grandes volumes de dados em partes menores, tornando as consultas mais eficientes. Isso é feito com o Spring Data JPA e a interface Pageable.

1. Adicionando Dependências ao Projeto

Se você já usa o Spring Data JPA, não é necessário adicionar novas dependências. Caso contrário, adicione ao pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. Criando uma Entidade JPA

Vamos supor que temos uma entidade Usuario:

import jakarta.persistence.*;

@Entity
@Table(name = "usuarios")
public class Usuario {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String email;

    // Getters e Setters
}

3. Criando um Repositório com Paginação

Para habilitar a paginação, basta estender JpaRepository:

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UsuarioRepository extends JpaRepository<Usuario, Long> {
    Page<Usuario> findByNomeContaining(String nome, Pageable pageable);
}

Explicação:

  • Page<Usuario> permite retornar os resultados paginados.
  • findByNomeContaining() busca usuários filtrando pelo nome.
  • Pageable define a página atual e o tamanho da página.

4. Criando um Endpoint com Paginação

Agora, crie um Controller para listar os usuários paginados:

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/usuarios")
public class UsuarioController {
    private final UsuarioRepository usuarioRepository;

    public UsuarioController(UsuarioRepository usuarioRepository) {
        this.usuarioRepository = usuarioRepository;
    }

    @GetMapping
    public Page<Usuario> listarUsuarios(Pageable pageable) {
        return usuarioRepository.findAll(pageable);
    }
}

Explicação:

  • Pageable permite passar parâmetros de paginação na requisição.
  • findAll(pageable) retorna os usuários paginados automaticamente.

5. Fazendo uma Requisição com Paginação

Agora, ao chamar a API via GET, você pode adicionar parâmetros para definir a página e a quantidade de registros por página:

GET http://localhost:8080/usuarios?page=0&size=5&sort=nome,asc

Parâmetros:

  • page=0 → Primeira página.
  • size=5 → Retorna 5 registros por página.
  • sort=nome,asc → Ordena pelo nome de forma crescente.

A resposta será algo como:

{
    "content": [
        { "id": 1, "nome": "Ana", "email": "ana@email.com" },
        { "id": 2, "nome": "Carlos", "email": "carlos@email.com" }
    ],
    "totalElements": 10,
    "totalPages": 2,
    "size": 5,
    "number": 0
}

6. Paginação com Filtros Personalizados

Se quiser buscar usuários filtrando pelo nome, ajuste o Controller:

@GetMapping("/buscar")
public Page<Usuario> buscarUsuarios(@RequestParam String nome, Pageable pageable) {
    return usuarioRepository.findByNomeContaining(nome, pageable);
}

Agora, faça a requisição:

GET http://localhost:8080/usuarios/buscar?nome=Joao&page=0&size=5

Conclusão

A paginação no Spring Boot é extremamente fácil de implementar usando o Spring Data JPA. Com poucos ajustes, podemos melhorar a performance da API e reduzir o consumo de memória ao lidar com grandes volumes de dados.

A paginação é essencial para otimizar aplicações que lidam com grandes volumes de dados. Sem paginação, consultas podem consumir muitos recursos do servidor, tornando a API lenta e sobrecarregada. Com Spring Boot, a implementação é direta e eficiente, garantindo melhor desempenho sem complexidade adicional.

Algumas aplicações:

  • Exibir listagens de usuários, produtos ou pedidos
  • Melhorar a performance de APIs que lidam com grandes volumes de dados
  • Facilitar a navegação entre páginas de resultados
  • Evitar sobrecarga no banco de dados

Dicas para quem está começando

  • Use Pageable para evitar sobrecarga do banco de dados
  • Permita ordenação dinâmica com sort=campo,asc
  • Evite retornar listas muito grandes sem paginação
  • Teste a performance com diferentes tamanhos de página

Contribuições de Rodrigo Farias

Compartilhe este tutorial: Como fazer paginação de resultados no Spring Boot

Compartilhe este tutorial

Continue aprendendo:

Como configurar filtros (Filters) em uma aplicação Java Web

Os filtros em uma aplicação Java Web permitem interceptar requisições e respostas HTTP, sendo usados para segurança, autenticação e monitoramento.

Tutorial anterior

O que é o conceito de Dependency Injection no Spring

A Injeção de Dependência (Dependency Injection) no Spring permite gerenciar e instanciar componentes automaticamente, seguindo o princípio da inversão de controle (IoC).

Próximo tutorial