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" ..?

¿Fue útil?

Solución

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

  2. 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];
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top