Deriving Class from Generic T

前端 未结 2 1988
南方客
南方客 2020-12-15 10:57

I have a parameterized hibernate dao that performs basic crud operations, and when parameterized is used as a delegate to fulfil basic crud operations for a given dao.

相关标签:
2条回答
  • 2020-12-15 11:14

    There is the way how to figure out class of type argument T using reflection:

    private Class<T> persistentClass = (Class<T>)
        ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    

    Here is the way how I use it:

    public class GenericDaoJPA<T> implements GenericDao<T> {
    
        @PersistenceContext
        protected EntityManager entityManager;
    
        protected Class<T> persistentClass = figureOutPersistentClass();
    
        private Class<T> figureOutPersistentClass() {
            Class<T> clazz = (Class<T>)((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[0];
            log.debug("persistentClass set to {}", clazz.getName());
            return clazz;
        }
    
        public List<T> findAll() {
            Query q = entityManager.createQuery("SELECT e FROM " + persistentClass.getSimpleName() + " e");
            return (List<T>) q.getResultList();
        }
    
    }
    

    I suppose this only works when your ConcreteEntityDao is a direct superclass of HibernateDao<ConcreteEntity,...>.

    I've found it here: www.greggbolinger.com/blog/2008/04/17/1208457000000.html

    0 讨论(0)
  • 2020-12-15 11:18

    You could have the Class passed as a constructor argument.

    public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID> {
    
        private final Class<? extends T> type;
    
        public HibernateDao(Class<? extends T> type) {
            this.type = type;
        }
    
        // ....
    
    }
    
    0 讨论(0)
提交回复
热议问题