2012-04-19 9 views
0

実際には...私はいくつかの機能を持っている一般的な

@Override 
public List<ContentType> findAllContentTypes() { 
    return this.emf.createEntityManager() 
        .createNamedQuery("ContentType.findAll", ContentType.class) 
        .getResultList(); 
} 

@Override 
public List<Status> findAllStatus() { 
    return this.emf.createEntityManager() 
        .createNamedQuery("Status.findAll", Status.class) 
        .getResultList(); 
} 

を、これらの機能を統合するためにどのように私は別のもののすべての種類を取得し、これらの約12あります。私はこれらの機能を取り入れて、これらの機能をすべて置き換える汎用機能を作りたいと思います。

これを行うには、findAll("Language")のような方法があります。私は

public List<T> findAll(String objectName) { 
    return this.emf.createEntityManager() 
        .createNamedQuery(objectName+".findAll", objectName) 
        .getResultList(); 
} 

Tで何をするかわからないとのフィット感を投げ、私のIDE以外の)問題は、私はその文字列を取り、代わりにそれを渡しするかどうかはわかりませんということです...始めましたContentType.class

NetbeansがTを認識するのを防ぐには何が欠けていますか?

createNamedQuery()に2番目のパラメータとして渡していますか?objectNameは動作しますか?

答えて

4

メソッドの戻り値の型の前に型パラメータリスト(この場合は<T>)を追加して、メソッドを汎用として宣言する必要があります。それからちょうどパラメータとして右のタイプのクラスオブジェクトを渡す:このような

public <T> List<T> findAll(Class<T> clazz) { 
    return this.emf.createEntityManager().createNamedQuery(
      clazz.getSimpleName()+".findAll", clazz).getResultList(); 
} 
+0

あなたは説明できます'publicリスト'だけでなく? – Webnet

+1

どのタイプのタイプが ''であるかを示す必要があるので、Tに ''のように別のklassを拡張させることができます。 ''を宣言することで、オブジェクト(つまり、すべての型)を拡張する任意の型であることが示されます –

+0

Gotcha!また、 'contentDao.findAll(" User ")'または 'contentDao.findAll(new User())'は、この関数が探しているものではないようです... – Webnet

2

何かがトリックを行う必要があります:私は `公共 一覧 `を持っている必要がある理由

public <T> List<T> findAll(Class<T> klass) { 
    return this.emf.createEntityManager().createNamedQuery(klass.getSimpleName()+".findAll", klass).getResultList(); 
}