Paginação é uma técnica usada para gerenciar grandes conjuntos de dados em um banco de dados, retornando apenas uma parte dos resultados por vez. Ela é essencial para melhorar o desempenho e a experiência do usuário em aplicações que lidam com grandes volumes de dados.
- LIMIT: Define quantos itens serão exibidos por página.
- OFFSET: Determina quantos itens serão "pulados" antes de começar a exibir os resultados.
- Desempenho: Minimiza o impacto no banco de dados, retornando apenas os dados necessários.
- Escalabilidade: Evita sobrecarga de consultas em tabelas grandes.
- Melhor UX: Facilita a navegação em dados paginados, com respostas rápidas.
SELECT *
FROM users
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;LIMIT 10: Mostra 10 registros.OFFSET 20: Pula os 20 primeiros registros e exibe os próximos 10.
import { IsInt, IsOptional, Min } from 'class-validator';
export class PaginationDto {
@IsOptional()
@IsInt()
@Min(1)
take?: number; // Quantos itens exibir por página (LIMIT)
@IsOptional()
@IsInt()
@Min(0)
skip?: number; // Quantos itens pular (OFFSET)
}import { Injectable } from '@nestjs/common';
import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { PaginationDto } from './dto/pagination.dto';
import { Product } from './entities/product.entity';
@Injectable()
export class ProductsService {
constructor(
@InjectRepository(Product)
private readonly productRepository: Repository<Product>,
) {}
async findAll(paginationDto: PaginationDto) {
const { take = 10, skip = 0 } = paginationDto; // Valores padrão
const [results, total] = await this.productRepository.findAndCount({
take,
skip,
order: { name: 'ASC' }, // Ordenação
});
return {
data: results,
total,
totalPages: Math.ceil(total / take),
currentPage: Math.floor(skip / take) + 1,
};
}
}findAndCount: Retorna os dados e a contagem total de itens da consulta.- Paginação simplificada: O DTO encapsula as regras de validação e facilita o uso.
- Desempenho: Garante que o banco de dados processe apenas o necessário para cada página.