2012-02-03 3 views
1

Мне нужно написать java generic метод, который не получает никакого параметра и возвращает List. Этот общий метод используется спящий режим:Как вызвать общий метод без параметров?

public <T> List list() { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    List result = session.createQuery("from " + T.class.getName()).list(); 
    return result; 
} 

Я Тринг, чтобы вызвать этот метод. Я попробовал следующее, но он создает ошибки компиляции:

mgr.list<User>(); 
mgr.list()<User>; 
mgr.list(<User>); 

Как я могу назвать этот метод?

+2

делает строку: 'результат List = session.createQuery ("от" + T.class. getName()). list(); 'также дает вам ошибку компиляции? – ggreiner

+0

@ggreiner: да .. как вы знаете? .. он говорит мне, что «невозможно выбрать из переменной типа». Я думаю, что это что-то связанное с возможностями спящего режима для моей IDE. Как я могу заставить его пройти нормально? – Naor

ответ

4

Я считаю, что то, что вы пытаетесь выполнить, требует некоторого рефакторинга. Похоже, вы пытаетесь создать общий класс Dao, который можно повторно использовать для запроса любого объекта модели. Проблема в том, что, не передавая класс методу, вы не можете получить тип генератора <T> во время выполнения.

Один из способов добиться того, что вы хотите, - создать базовое dao, которое расширено конкретными реализациями, которые знают класс, с которым они имеют дело во время компиляции.

public abstract class AbstractDao<T>{ 
    private Class<T> clazz; 
    public AbstractDao(Class<T> clazz){ 
    this.clazz = clazz; 
    } 


    public List<T> list() { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    List result = session.createQuery("from " + clazz.getName()).list(); 
    return (List<T>) result; 
    } 
} 

Затем расширить класс:

class UserDao extends AbstractDao<User>{ 
    public UserDao(){ 
     super(User.class); 
    } 
} 

Затем вызовите метод:

List<User> users = userDao.list(); 
+0

Спасибо вам большое! – Naor

+0

Проблема с этой реализацией заключается в том, что я должен создать экземпляр AbstractDao для типа сущности eac. Есть ли способ создать неосновное дао, но его методы будут универсальными, поэтому я мог бы инициировать дао только один раз? – Naor

+0

Единственный способ сделать это - изменить подпись метода 'list', например: public Список list (Class clazz) {' – ggreiner

7

Вы это один забыл:

mgr.<User>list() 
1

Это может иметь что-то делать с «типа стирания», из-за использования дженериков. Когда вы позвоните

T.class.getName() 

, что тип T стирается до времени выполнения. Он недоступен во время выполнения, он используется только во время компиляции, чтобы обеспечить безопасность типа. Вероятно, вам нужно написать код, чтобы получить свой тип класса persitence во время выполнения, а затем использовать его в классе mgr. Exmaple является

public abstract class GenericHibernateDAO<T, ID extends Serializable> 
     implements GenericDAO<T, ID> { 

    private Class<T> persistentClass; 
    private Session session; 

    public GenericHibernateDAO() { 
     this.persistentClass = (Class<T>) ((ParameterizedType) getClass() 
           .getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 

    // more methods 


} 

из https://community.jboss.org/wiki/GenericDataAccessObjects?_sscc=t

Здесь он имеет persistentClass, который установлен для параметра типа во время строительства, то, что persistentClass в классе, когда это необходимо.

Смежные вопросы