Переписать Java-метод, используя отражение - PullRequest
2 голосов
/ 22 ноября 2010

Я пытаюсь переписать следующий java-метод, который возвращает список объектов (объектов домена hibenrate), чтобы сделать его более универсальным, чтобы просто написать его один раз и иметь возможность передать ему любой объект.

public List<GsCountry> getCountry() {   
    Session session = hibernateUtil.getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();
    tx.begin();
    List<GsCountry> countryList = new ArrayList<GsCountry>();
    Query query = session.createQuery("from GsCountry");
    countryList = (List<GsCountry>) query.list();
    return countryList;
}

как я могу сделать это, чтобы можно было свободно возвращать список типов, которые я передал в качестве аргумента?

Ответы [ 3 ]

2 голосов
/ 22 ноября 2010

Вот пример кода, из Не повторяйте DAO , вы найдете полезным.

public class GenericDaoHibernateImpl <T, PK extends Serializable>
    implements GenericDao<T, PK>, FinderExecutor {
    private Class<T> type;

    public GenericDaoHibernateImpl(Class<T> type) {
        this.type = type;
    }

    public PK create(T o) {
        return (PK) getSession().save(o);
    }

    public T read(PK id) {
        return (T) getSession().get(type, id);
    }

    public void update(T o) {
        getSession().update(o);
    }

    public void delete(T o) {
        getSession().delete(o);
    }

    // Not showing implementations of getSession() and setSessionFactory()
}
2 голосов
/ 22 ноября 2010

Ответ Джинеша Пареха хорош, но в нем отсутствуют две детали.

a) для реализации универсального возвращаемого типа необходим параметр-класс
б) нет такой конструкции, как E.model, вместо этого используйте clazz.getSimpleName()

public List<E> getData(Class<E> clazz) {
    // insert Jinesh Parekh's answer here
    // but replace E.model with clazz.getSimpleName()
}
2 голосов
/ 22 ноября 2010
//making the method name more generic
public List<E> getData() {   
    Session session = hibernateUtil.getSessionFactory().openSession();
    Transaction tx = session.beginTransaction();
    tx.begin();
    List<E> result = new ArrayList<E>();

    // try to add a model final static field which could retrieve the 
    // correct value of the model. 
    Query query = session.createQuery("from " + E.model);
    result = (List<E>) query.list();
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...