JPQL查询SELECT可选+泛型DAO选择

时间:2010-02-16 10:17:42

标签: jpa java-ee jpql

我已经按照一个有效的JPA示例来检索Category对象:

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

查询非常简写 - 我无法找到任何指南的规则和任何指南中的规则。这简洁可以接受吗?

其次,我想在一个通用的DAO中实现它,例如:

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

如何重写第一个查询以适用于所有类型,因为我无法硬编码“来自类别”..?

2 个答案:

答案 0 :(得分:5)

  1. 是的,简洁是可以接受的。虽然我更喜欢完整的语法,因为它对那些拥有更多SQL经验的人更具“吸引力”。

  2. 您必须在DAO中添加Class<E>参数:

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

答案 1 :(得分:2)

您实际上不必使用方法参数,但可以使用Reflection。

Example Code using Reflection

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];
    }
}