====== @NamedQuery y Organización ======
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.
----
--- //[[juanmiguel.bernal@ticarum.es|JUAN MIGUEL BERNAL GONZALEZ]] 05/10/2017 08:38//