Este ejemplo demuestra el uso completo del Query Builder de TypeORM, una herramienta poderosa para construir consultas SQL de forma programática y type-safe.
- Selección de campos específicos con
.select() - Condiciones WHERE con parámetros seguros
- Ordenamiento múltiple con
.orderBy()y.addOrderBy() - Limitación de resultados con
.limit()y.offset()
- LEFT JOIN: Incluye registros incluso si no tienen relación
- INNER JOIN: Solo registros que tienen relación
- joinAndSelect: Carga las relaciones en la consulta
- COUNT: Contar registros
- AVG: Promedio de valores
- SUM: Suma de valores
- MAX/MIN: Valores máximo y mínimo
- GROUP BY: Agrupación de resultados
- HAVING: Filtros sobre grupos
- Consultas anidadas para comparaciones complejas
- Uso de
.subQuery()para crear subconsultas - Comparación con promedios calculados dinámicamente
- Múltiples condiciones con
.andWhere()y.orWhere() - Búsqueda de texto con LIKE e ILIKE
- Filtros por rangos de fechas y valores numéricos
- Ordenamiento múltiple por diferentes criterios
- Conteo total de registros con
.getCount() - Paginación con
.skip()y.take() - Cálculo de páginas totales
- Construcción de consultas basada en filtros opcionales
- Aplicación condicional de WHERE clauses
- Búsquedas flexibles con múltiples criterios
- Uso de SQL nativo cuando es necesario
- Consultas complejas que aprovechan características específicas del motor de BD
- Integración de funciones SQL avanzadas
- Filtros por rangos de fechas
- Funciones de fecha específicas del motor de BD
- Cálculos temporales
- Lógica condicional en consultas
- Clasificación dinámica de datos
- Transformación de valores sobre la marcha
El ejemplo utiliza un modelo de blog con las siguientes entidades:
- User: Usuarios del sistema con roles y estadísticas
- Post: Artículos con métricas de engagement
- Comment: Comentarios con sistema de aprobación
- Category: Categorías para organizar contenido
- Tag: Etiquetas para clasificación adicional
# Instalar dependencias
npm install
# Ejecutar el ejemplo
npm run query-builder.where("user.age > :minAge", { minAge: 18 })- Previene inyección SQL
- Mejor rendimiento con consultas preparadas
.createQueryBuilder("user")- Simplifica las consultas
- Evita ambigüedad en joins
.getMany(): Múltiples registros.getOne(): Un registro o null.getCount(): Solo contar.getRawMany(): Datos sin entidades.getRawOne(): Un registro raw
.leftJoinAndSelect("user.category", "category")- Carga relaciones en una sola consulta
- Evita el problema N+1
- Type Safety: Verificación de tipos en tiempo de compilación
- Flexibilidad: Construcción dinámica de consultas
- Rendimiento: Control total sobre las consultas generadas
- Legibilidad: Código más claro que SQL string
- Reutilización: Consultas modulares y reutilizables
- Búsquedas Avanzadas: Filtros múltiples y dinámicos
- Reportes: Agregaciones y análisis de datos
- Paginación: Listados con paginación eficiente
- Dashboards: Estadísticas y métricas complejas
- APIs: Endpoints flexibles con múltiples opciones
- Usar parámetros en lugar de concatenar strings
- Limitar resultados para evitar consultas masivas
- Usar índices en campos de búsqueda frecuente
- Prefetch relaciones cuando sea necesario
- Optimizar joins para evitar consultas innecesarias
- Testear consultas para verificar rendimiento
El ejemplo muestra las consultas SQL reales generadas por TypeORM, permitiendo:
- Verificar la eficiencia de las consultas
- Debugging y optimización
- Aprendizaje de SQL avanzado
- Identificación de problemas de rendimiento