MÓDULO 6 - Spring Data JPA Avanzado
¡Bienvenido al Módulo 6! 🎯
En el Módulo 2, aprendió los fundamentos de Spring Data JPA: los 4 métodos CRUD (save, findById, findAll, deleteById) y 3 palabras clave simples (findBy, And, Or).
¡Ahora está listo para ir más allá!
Este módulo le enseña los conceptos avanzados de JPA para crear consultas complejas y gestionar relaciones entre entidades.
🎓 Objetivos de Aprendizaje
Al final de este módulo, usted será capaz de:
- ✅ Utilizar las 15+ palabras clave de Spring Data JPA
- ✅ Crear consultas personalizadas con @Query
- ✅ Gestionar relaciones (@OneToMany, @ManyToOne, @ManyToMany)
- ✅ Utilizar paginación y ordenamiento
- ✅ Optimizar el rendimiento de las consultas
📚 Prerrequisitos
Antes de comenzar este módulo, debe haber:
- ✅ Completado los Módulos 1 a 4
- ✅ Dominado los fundamentos de JPA (Módulo 2, Capítulo 5)
- ✅ Comprendido los repositories (
JpaRepository)
Si no tiene estos prerrequisitos, regrese al Módulo 2.
🗺️ Plan del Módulo
Parte Teórica (4 capítulos)
Capítulo 1: Convenciones de Nomenclatura Avanzadas
Duración: 1h
Contenido:
- Las 15+ palabras clave de Spring Data JPA
- Between, LessThan, GreaterThan
- Like, StartingWith, EndingWith, Containing
- In, NotIn, IsNull, IsNotNull
- True, False, IgnoreCase
- Ejemplos prácticos para cada palabra clave
¿Por qué es importante? Crear consultas complejas sin escribir SQL
Capítulo 2: Relaciones entre Entidades
Duración: 1h30
Contenido:
- @OneToOne (1-1)
- @OneToMany y @ManyToOne (1-N)
- @ManyToMany (N-N)
- Fetch types (LAZY vs EAGER)
- Operaciones en cascada
- Relaciones bidireccionales
¿Por qué es importante? Modelar datos reales complejos
Capítulo 3: Consultas Personalizadas con @Query
Duración: 1h
Contenido:
- Sintaxis JPQL
- @Query con JPQL
- @Query con SQL nativo
- Parámetros nombrados con @Param
- Named queries
- Consultas dinámicas
¿Por qué es importante? Ir más allá de las convenciones de nomenclatura
Capítulo 4: Paginación y Rendimiento
Duración: 1h
Contenido:
- Pageable y
Page<T> - Sort y ordenamiento multi-criterio
- Problema N+1
- Fetch strategies
- Proyecciones
- Optimización de consultas
¿Por qué es importante? Crear aplicaciones de alto rendimiento
Parte Práctica (3 TPs)
TP6.1: Convenciones Avanzadas
Duración: 2h
Objetivo: Dominar las 15+ palabras clave
Usted va a crear:
- Entidad Product con muchos campos
- 20 métodos de repository usando las palabras clave
- Pruebas para cada método
TP6.2: Relaciones Employee-Department
Duración: 2h
Objetivo: Gestionar las relaciones entre entidades
Usted va a crear:
- Entidades Employee y Department (OneToMany/ManyToOne)
- CRUD completo con relaciones
- Operaciones en cascada
- Pruebas de las relaciones
TP6.3: Ejercicio Airport-Flight-Passenger
Duración: 2h30
Objetivo: Evaluación completa
Usted va a:
- Modelar 3 entidades relacionadas
- Implementar 20 consultas (Fácil, Medio, Difícil)
- Solucionario proporcionado
- Auto-corrección
📊 Duración Total
| Tipo | Duración |
|---|---|
| Teoría | 4h30 (4 capítulos) |
| Práctica | 6h30 (3 TPs) |
| Total | 11h (~3-4 sesiones) |
🎯 Lo Que Va a Aprender
Antes del Módulo 6
// Usted sabía hacer esto:
public interface ProductRepository extends JpaRepository<Product, Long> {
List<Product> findByName(String name);
List<Product> findByNameAndPrice(String name, Double price);
}
Limitado a: Consultas simples con And y Or
Después del Módulo 6
// Usted sabrá hacer todo esto:
public interface ProductRepository extends JpaRepository<Product, Long> {
// Comparaciones
List<Product> findByPriceBetween(Double min, Double max);
List<Product> findByPriceLessThan(Double maxPrice);
List<Product> findByPriceGreaterThanEqual(Double minPrice);
// Búsqueda textual
List<Product> findByNameContaining(String keyword);
List<Product> findByNameStartingWith(String prefix);
List<Product> findByDescriptionLike(String pattern);
// Listas y nulos
List<Product> findByCategoryIn(List<String> categories);
List<Product> findByDiscountIsNull();
List<Product> findByActiveTrue();
// Ordenamiento y paginación
Page<Product> findByCategory(String category, Pageable pageable);
// Consultas personalizadas
@Query("SELECT p FROM Product p WHERE p.price < :maxPrice")
List<Product> findCheapProducts(@Param("maxPrice") Double maxPrice);
// SQL nativo
@Query(value = "SELECT * FROM products WHERE stock < 10", nativeQuery = true)
List<Product> findLowStock();
}
Usted dominará: Consultas complejas, relaciones, rendimiento
🚀 Por Qué Este Módulo Es Importante
1. Consultas Reales en Producción
En la empresa, usted NO hará solo findAll(). Necesitará:
// Encontrar los pedidos de un cliente en los últimos 30 días
List<Order> findByCustomerIdAndOrderDateAfter(Long customerId, LocalDate date);
// Productos sin stock en una categoría
List<Product> findByCategoryAndStockLessThan(String category, Integer minStock);
// Empleados de un departamento con salario en un rango
List<Employee> findByDepartmentAndSalaryBetween(Department dept, Double min, Double max);
¡Este módulo le prepara para la realidad!
2. Rendimiento de las Aplicaciones
Problema común: El Problema N+1
// ❌ Mala práctica - ¡N+1 consultas!
List<Department> departments = departmentRepo.findAll(); // 1 consulta
for (Department dept : departments) {
List<Employee> employees = dept.getEmployees(); // ¡N consultas!
// ...
}
Solución que aprenderá:
// ✅ Buena práctica - ¡Solo 1 consulta!
@Query("SELECT d FROM Department d JOIN FETCH d.employees")
List<Department> findAllWithEmployees();
¡Este módulo le enseña a escribir código eficiente!
3. Modelado de Datos Complejos
Caso real: E-commerce
Customer ──< Order >── Product
│
└──> Payment
Usted aprenderá a:
- Modelar estas relaciones
- Gestionar las cascadas (¿eliminar un Customer → sus Orders?)
- Optimizar las consultas
- Gestionar datos huérfanos
🗺️ Progresión en la Formación
Módulo 2: Fundamentos JPA (4 métodos, 3 palabras clave simples)
↓
Módulo 6: ← USTED ESTÁ AQUÍ - JPA Avanzado
(15+ palabras clave, relaciones, @Query, rendimiento)
↓
Proyectos: Aplicaciones completas con BDD complejas
Módulo 6 = ¡Convertirse en experto en Spring Data JPA!
📖 Cómo Abordar Este Módulo
Método Recomendado
-
Lea los capítulos en orden
- Capítulo 1: Convenciones (15+ palabras clave)
- Capítulo 2: Relaciones (OneToMany, ManyToOne, etc.)
- Capítulo 3: @Query (JPQL, SQL nativo)
- Capítulo 4: Rendimiento (paginación, optimización)
-
Realice los TPs progresivamente
- TP6.1: Practique las convenciones (2h)
- TP6.2: Practique las relaciones (2h)
- TP6.3: Evaluación completa (2h30)
-
Pruebe todo el código
- No copie, escriba el código
- Pruebe cada consulta
- Comprenda los resultados
Tiempo Recomendado
Opción Intensiva (1 fin de semana):
- Sábado: Capítulos 1-2 + TP6.1
- Domingo: Capítulos 3-4 + TP6.2 + TP6.3
Opción Progresiva (3 sesiones):
- Sesión 1: Capítulos 1-2 + TP6.1
- Sesión 2: Capítulo 3 + TP6.2
- Sesión 3: Capítulo 4 + TP6.3
✅ Autoevaluación
Antes de comenzar, pruebe sus conocimientos:
- ¿Sabe crear un método
findByPriceBetween? ☐ Sí ☐ No - ¿Conoce @OneToMany y @ManyToOne? ☐ Sí ☐ No
- ¿Sabe utilizar @Query? ☐ Sí ☐ No
- ¿Comprende el problema N+1? ☐ Sí ☐ No
- ¿Sabe paginar resultados? ☐ Sí ☐ No
Si respondió "No" a 2 preguntas o más → ¡Este módulo es ESENCIAL para usted!
Después del módulo, repita esta prueba. ¡Debe responder "Sí" en todas!
🎯 Próximo Paso
¿Listo para convertirse en experto en Spring Data JPA?
➡️ Comenzar con el Capítulo 1: Convenciones de Nomenclatura Avanzadas