2013-12-18 46 views
4

我有用於添加,更新和刪除實體的通用方法。但我也想用泛型來檢索數據。如何實現通用方法從Hibernate中獲取數據庫中的數據?

這裏是我的方法來獲得數據:

public static List<ClassA> getAllClassAData() { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Criteria criteria = session.createCriteria(ClassA.class); 
    return criteria.list(); 
} 

public static List<ClassB> getAllClassBData() { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Criteria criteria = session.createCriteria(ClassB.class); 
    return criteria.list(); 
} 

public static List<ClassC> getAllClassCData() { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Criteria criteria = session.createCriteria(ClassC.class); 
    return criteria.list(); 
} 

我試圖做這樣的事情:

public static <T> List<T> getAllData() { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Criteria criteria = session.createCriteria(???.class); //Here is where I'm stuck 
    return criteria.list(); 
} 

而且我堅持了通過以班級爲ARG爲標準創造:

Criteria criteria = session.createCriteria(Generic.class); 

如何讓JVM知道在創建標準時我想通過哪個類?

回答

6

你的泛型方法應該看起來更像是:

public static <T> List<T> getAllData(Class<T> clazz) { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Criteria criteria = session.createCriteria(clazz); 
    return criteria.list(); 
} 

,你應該調用它想:

List<ClassA> list = getAllData(ClassA.class); 
+0

謝謝,它適用於我,因爲我想。順便說一句,我使用靜態上下文,因爲我有幾個方法與數據庫進行通信,並且不需要創建DBUtil實例。至少我沒有看到在一個小項目中做這件事的理由。 – Dragon

2

一個簡單的步驟,以模擬爲動態是通過對查詢類的實例。它看起來很醜陋,但做的工作。不幸的是沒有辦法做到某事像T.class

public static <T> List<T> getAllData(Class<T> klass) { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Criteria criteria = session.createCriteria(klass); 
    return criteria.list(); 
} 
相關問題