JPA NamedQueries es una de las características más utilizadas de JPA ya que nos permite diseñar las consultas en las propias entidades y tenerlas muy a mano. Sin embargo según va creciendo el proyecto podemos tener algunos problemas. Vamos a mostrar un posible bloque de código:
package com.arquitecturajava; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; @Entity @NamedQueries({ @NamedQuery(name="seleccionarAlumnosNombre", query="select a from Alumno a where a.nombre=:nombre"), @NamedQuery(name="seleccionarAlumnosApellidos", query="select a from Alumno a where a.apellidos=:apellidos") }) public class Alumno implements Serializable{ private static final long serialVersionUID = 1L; @Id private String dni; private String nombre; private String apellidos; private int edad; public Alumno() { super(); } public Alumno(String dni, String nombre, String apellidos, int edad) { super(); this.dni = dni; this.nombre = nombre; this.apellidos = apellidos; this.edad = edad; } // getters/setters public String getDni() { return dni; } public void setDni(String dni) { this.dni = dni; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getApellidos() { return apellidos; } public void setApellidos(String apellidos) { this.apellidos = apellidos; } public int getEdad() { return edad; } public void setEdad(int edad) { this.edad = edad; } }
Se trata de una entidad muy sencilla que contiene el concepto de Alumno y dos NamedQueries (seleccionarAlumnosNombre, seleccionarAlumnosApellidos). Las consultas funcionarán sin problemas. Ahora bien :¿Qué pasará cuando tengamos más clases y más consultas?.
Para tener una mejor organización, lo haremos utilizando constantes:
package com.arquitecturajava; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; @Entity @NamedQueries({ @NamedQuery(name=Alumno.SELECCIONAR_ALUMNOS_POR_NOMBRE, query="select a from Alumno a where a.nombre=:nombre"), @NamedQuery(name=Alumno.SELECCIONAR_ALUMNOS_POR_APELLIDOS, query="select a from Alumno a where a.apellidos=:apellidos") }) public class Alumno implements Serializable{ private static final long serialVersionUID = 1L; public static final String SELECCIONAR_ALUMNOS_POR_NOMBRE = "Alumno.seleccionarAlumnosNombre"; public static final String SELECCIONAR_ALUMNOS_POR_APELLIDOS = "Alumno.seleccionarAlumnosApellidos"; @Id private String dni; private String nombre; private String apellidos; private int edad; public Alumno() { super(); } public Alumno(String dni, String nombre, String apellidos, int edad) { super(); this.dni = dni; this.nombre = nombre; this.apellidos = apellidos; this.edad = edad; } // getters/setters ... }
Ahora tenemos las constantes SELECCIONAR_ALUMNOS_POR_NOMBRE y SELECCIONAR_ALUMNOS_POR_APELLIDOS que podemos utilizar en los DAS a la hora de utilizar estas consultas nombradas.
— JUAN MIGUEL BERNAL GONZALEZ 05/10/2017 08:38