Consulta JPQL Selecione opcional + DAO genérico Selecionar
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" ..?
Solução
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.
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];
}
}