2016-03-23 19 views
0

私は非常に基本的な質問がありますが、正しい解決策を見つけることはできません。 JPAEntityのクラスへの参照のみを持つCriteriaQueryを使用して、JPAEntityのすべてのレコードを読みたいと思います。それぞれのJPAEntitesで動作するはずです。異なるエンティティのCriteriaQuery

folowingコードが動作し、それは私が欲しいものを行います。

private void test(Field jpaField) { 
    List l; 
    final Class c = jpaField.getType(); 

    final CriteriaQuery criteriaQuery = em.getCriteriaBuilder().createQuery(c); 
    criteriaQuery.select(criteriaQuery.from(c)); 
    l = em.createQuery(criteriaQuery).getResultList(); 

    ... 
} 

しかし、私はタイプのセイフティに関する多くの警告を取得します。

private void test(Field jpaField) { 
    List<?> l; 
    final Class<?> c = jpaField.getType(); 

    final CriteriaQuery<?> criteriaQuery = em.getCriteriaBuilder().createQuery(c); 
    criteriaQuery.select(criteriaQuery.from(c)); 
    l = em.createQuery(criteriaQuery).getResultList(); 

    ... 
} 

この問題を解決するために、以下の修正を試みましたが、タイプが一致しない場合にエラーが発生しました。私は何とかcreateQuery(c)とfrom(c)が同じ型を使用することを保証しなければならないと思います。しかし、私は方法を知らない。誰もこのパターンを正しく使う方法を知っていますか?

ありがとうございます。

ドミニク

+0

しかし、 'Field'は' Entity'ではありませんか? –

+0

説明に欠けている部分があります。この例のjpaFieldは、他のエンティティを指すManyToOneフィールドです。したがって、jpaField.getType()と結果として、変数cはJPA-Entityです。あなたはフィールドを忘れて、クラスcをJPA-Entityクラスとして取ることができます。それは残念です。 wirttenとして:コードは、型を指定するのではなく警告を指定しない限り動作します。 – Dominic

答えて

1

としては、一般的なfindAllメソッドのシグネチャは、私が概念化するトリッキーな部分がClass<T> entityだと思う

<T> List<T> findAll(Class<T> entity) 

で、指摘されました。

<T> CriteriaQuery<T> createQuery(Class<T> resultClass) 

だからジェネリックfindAll方法がそうのように書かれている:

public <T> List<T> findAll(Class<T> entity) { 
    CriteriaQuery<T> q = em.getCriteriaBuilder().createQuery(entity); 
    q.select(q.from(entity)); 
    return em.createQuery(q).getResultList(); 
} 

はそうと同じように使用:

しかし、あなたは createQueryの署名を見れば、あなたはそれが基本的に同じですがわかります

実行時オブジェクトでジェネリックがコンパイル時の制約であるため、エンティティ自体を汎用メソッドに渡すことはできません。

+0

"ジェネリックメソッドを渡すことはできませんエンティティ自体は実行時オブジェクトであり、ジェネリックスはコンパイル時の制約であるためです。デザインタイムにクラスを持っていないので、私はそれを正確に知っています。それは警告なしでこれを行うことが可能でなければなりません。 – Dominic

+0

'getClass()'を呼び出すのに何が問題なのですか? –

0

これは方法論的な質問です。おそらく、メソッドの外側でgetType()を呼び出すことができますか?

private <T> List<T> test(Class<T> jpaFieldClass) .... 
+0

設計時に特定のEntity-Classを持つことはありませんので、コードを汎用としてカプセル化することはできません。問題はエンティティクラスをどこから取得するのかではなく、エンティティクラスをどこからでも持っていれば、警告なしでCriteriaQueryを使ってすべてのレコードを読むことができます... – Dominic

関連する問題