2012-02-03 86 views
1

我需要編寫java通用方法,它不會獲取參數並返回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

確實行:'列表結果= session.createQuery( 「從」 + T.class。 getName()).list();'也給你一個編譯錯誤? – ggreiner 2012-02-03 18:53:40

+0

@ggreiner:是的......你怎麼知道的?它告訴我「不能從類型變量中選擇」。我認爲這與我的IDE的休眠編譯功能有關。我怎樣才能讓它通過? – Naor 2012-02-03 18:58:53

回答

4

我相信你正在努力完成的事情需要一些重構。看起來你正在試圖創建一個通用的Dao類,你可以重用它來查詢任何Model對象。問題是,如果不將類傳遞給該方法,則無法在運行時獲得<T>通用類型。

完成你想要的東西的一種方法是創建一個基本道,它由編譯時知道它處理的類的特定實現擴展。

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 2012-02-03 19:07:32

+0

這個實現的問題是我必須爲eac實體類型創建AbstractDao的實例。有沒有辦法創建一個非泛型dao,但它的方法將是通用的,所以我可以將dao只實例化一次? – Naor 2012-02-03 20:21:22

+0

要做到這一點的唯一方法是修改'list'的方法簽名,如下所示:'public List list(Class clazz){' – ggreiner 2012-02-03 20:24:03

7

你忘了這一個:

mgr.<User>list() 
1

它可能有一些做「類型擦除」,因爲仿製藥使用的。當您致電

T.class.getName() 

T型在運行時間之前被擦除。它在運行時不可用,它僅在編譯時用於確保類型安全。您可能需要編寫一些代碼,以便在運行時獲得persitence類的類型,然後在mgr類中使用該類。的〔實施例是

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。

相關問題