JPQL consulta de selección DAO opcional + genérica seleccione
Pregunta
He seguido un ejemplo de trabajo para recuperar la APP Categoría objetos tales como:
return (ArrayList<Category>) getEntityManager().createQuery("from Category").getResultList();
La consulta es muy abreviada - y no puedo encontrar las reglas para lo que es opcional y lo que no está en ninguna de las guías. Es aceptable este brevedad?
En segundo lugar, quiero poner en práctica ahora esta en un DAO genérico, algo como:
public interface DAO<E, K>
{
List<E> getAll();
}
¿Cómo puedo volver a escribir la primera consulta a trabajar para todo tipo ya que no puedo codificar el "de la categoría" ..?
Solución
-
Sí, la brevedad es aceptable. Aunque prefiero la sintaxis completa porque es más "atractiva" a otras personas que tienen más experiencia en SQL.
-
Hay que añadir un parámetro
Class<E>
a su DAO:public List<E> getAll(Class<E> entityClass) { Query query = enittyManager.createQuery("from " + entityClass.getName()); query.getResultList(); }
Otros consejos
En realidad no tiene que utilizar un parámetro de método, pero puede utilizar la reflexión.
Ejemplo de código usando la reflexión
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class<T> DAO {
protected Class<T> clazz;
public DAO()
{
Type genericSuperclass = getClass().getGenericSuperclass();
// Allow this class to be safely instantiated with or without a parameterized type
if (genericSuperclass instanceof ParameterizedType)
clazz = (Class<T>) ((ParameterizedType) genericSuperclass).getActualTypeArguments()[0];
}
}