Saltar la navegación

6.1. NamedQueries

Uno de los problemas que nos podemos encontrar cuando construimos las consultas es que varios desarrolladores van a trabajar en el mismo proyecto construyendo consultas. Con lo cual puede que acabemos con consultas repetidas en distintas partes del código.

Para evitar este problema podemos apoyarnos en JPA NamedQueries que nos permiten definir las consultas a nivel de clase de dominio evitando las repeticiones.

Los ejemplos a continuación estarán basado en el diagrama siguiente:

Diagrama

Ejemplo

En el siguiente ejemplo se muestran diferentes consultas para obtener información almacenada en la tabla tAsignatura a través de su clase AsignaturaEntity.

@Entity
@Table(name="tAsignaturas")
@NamedQueries({
        @NamedQuery(name="listaAsignaturas", query="select a from AsignaturaEntity a"),
        @NamedQuery(name="listaAsignaturasNombre", query="select a from AsignaturaEntity a where a.nombre=:nombre"),
        @NamedQuery(name="listaAsignaturasCurso", query="select a from AsignaturaEntity a where a.curso=:curso"),
        @NamedQuery(name="listaAsignaturasHoras", query="select a from AsignaturaEntity a where a.horas=:horas"),
})
public class AsignaturaEntity{ ... }

Luego, estas consultas pueden ser llamadas, por ejemplo, desde un método como el que sigue:

//    Consulta genérica
public List listar(String namedQuery) {
        TypedQuery lista = sesion.getNamedQuery(namedQuery);
        return lista.getResultList();
    }
//    Mostrar las asignaturas por curso
    public List listar(String namedQuery,String param, String valor) {
        TypedQuery lista = sesion.getNamedQuery(namedQuery).setParameter(param,valor);
        return lista.getResultList();
    }