JPQL es un lenguaje de consulta utilizado en JPA para consultar entidades Java, no tablas directamente.
A diferencia de SQL, en JPQL se usan clases y atributos del modelo, no nombres de tablas o columnas.
Por ejemplo:
SQL tradicional:
SELECT * FROM series WHERE titulo = 'Breaking Bad';
JPQL:
SELECT s FROM Serie s WHERE s.titulo = 'Breaking Bad'
Aquí:
Serie es la entidad
s es un alias
s.titulo es un atributo de la clase
Documentación oficial:
https://jakarta.ee/specifications/persistence/3.1/jakarta-persistence-spec-3.1.html
Ejemplo en SerieRepository
Para usar JPQL en Spring Data JPA, utilizamos la anotación @Query.
Buscar serie por título ignorando mayúsculas
@Query("SELECT s FROM Serie s WHERE LOWER(s.titulo) = LOWER(:titulo)")
Optional buscarSeriePorTitulo(String titulo);
Esto permite buscar:
"Breaking Bad"
"breaking bad"
"BREAKING BAD"
Buscar series por género
@Query("SELECT s FROM Serie s WHERE s.genero LIKE %:genero%")
List buscarPorGenero(String genero);
Ejemplo:
repositorio.buscarPorGenero("Drama");
Buscar series con evaluación mínima
@Query("SELECT s FROM Serie s WHERE s.evaluacion >= :nota")
List buscarPorEvaluacion(Double nota);
Buscar las mejores series
@Query("SELECT s FROM Serie s ORDER BY s.evaluacion DESC")
List buscarMejoresSeries();
Buscar series con pocas temporadas
@Query("SELECT s FROM Serie s WHERE s.totalTemporadas <= :temporadas")
List buscarSeriesCortas(Integer temporadas);
Ejemplo de uso en la aplicación
System.out.println("Series con evaluación mayor a 8:");
repositorio.buscarPorEvaluacion(8.0)
.forEach(System.out::println);
Ventajas de JPQL
consultas más complejas
control total sobre la consulta
permite joins entre entidades
funciona directamente con objetos Java
Ejemplo avanzado con relación Serie–Episodio
@Query("SELECT e FROM Episodio e WHERE e.serie.titulo = :titulo")
List buscarEpisodiosPorSerie(String titulo);
Esto consulta episodios usando la relación:
Serie 1 ---- * Episodio
Resumen
JPQL permite:
consultar entidades Java
usar parámetros (:param)
hacer filtros (WHERE)
ordenar (ORDER BY)
usar funciones (LOWER, UPPER)
trabajar con relaciones entre entidades