@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.


JUAN MIGUEL BERNAL GONZALEZ 05/10/2017 08:38