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.
Por que a paginação é essencial para APIs de alto desempenho?
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