Pergunta

Eu segui um exemplo JPA em funcionamento para recuperar objetos de categoria como tal:

return (ArrayList<Category>) getEntityManager().createQuery("from Category").getResultList();

A consulta é muito abreviada - e não consigo encontrar as regras para o que é opcional e o que não está em nenhum dos guias. Esta brevidade é aceitável?

Em segundo lugar, quero implementar isso agora em um DAO genérico, algo como:

public interface DAO<E, K>
{
    List<E> getAll();
}

Como posso reescrever a primeira consulta a funcionar para todos os tipos, pois não consigo codificar o "da categoria" ..?

Foi útil?

Solução

  1. Sim, a brevidade é aceitável. Embora eu prefira a sintaxe completa, porque é mais "atraente" para outras pessoas que têm mais experiência em SQL.

  2. Você tem que adicionar um Class<E> Parâmetro do seu DAO:

    public List<E> getAll(Class<E> entityClass) {
         Query query = enittyManager.createQuery("from " + entityClass.getName());
         query.getResultList();
    }
    

Outras dicas

Na verdade, você não precisa usar um parâmetro de método, mas pode usar a reflexão.

Código de exemplo usando reflexão

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top