2011-12-28 14 views
4

createQuery()。listを使用した後のキャスト警告を避けることはできますか?Hibernateを使用した型の安全警告の回避Query.list()

//Type safety: The expression of type List needs unchecked conversion to conform to List<User> 
List<User> user = (List<User>) session.createQuery("select u from User u").list(); 

私は次のような一般的なパラメータまたはメソッドパラメータを経由してターゲット・オブジェクトを指定する方法を見つけることが期待される:

List<User> user = session.createQuery("select u from User u").list(User.class); 
+1

悲しい答えは、HibernateのAPIを介してこれを行うのは容易/クリーンな方法がないことであるようです。意図的であればこれがなぜそうであるのかという設計上の理由から、洞察が大好きです。 – dcompiled

答えて

4

最も重要なことは、警告はコンパイラによるものであり、休止状態ではないことです。 - 実装されていないジェネリックを無視するようにコンパイラに指示できます。 HQLを使用することで、残念ながらjavaが検証する能力を持たない型安全なデータをクエリしています。

のように、休止状態の鋳物の構文醜さを回避する方法ならばたくさんあります:

1)は、鋳造または

2)は、新しいを作成するために、Collections.checkedListメソッドを使用@SuppressWarningsを使用リスト。

も参照してください:How to avoid type safety warnings with Hibernate HQL results?

+0

さらに検索してこの質問を見つけました。私は早くそれを見つけたでしょうが、代わりに「強く型付けされたハイバネートクエリ」を探していました。 – dcompiled

1

あなたはあなたがEntityManagerを使用する場合は警告を回避することはできませんが、それは物事がどんな立派行う場合:

EntityManager em = provider.get(); // your code will probably be different here 
CriteriaBuilder builder = em.getCriteriaBuilder(); 
CriteriaQuery<T> query = builder.createQuery(type); // your Class<T> 
Root<T> root = query.from(type); // your Class<T> 
query.select(root); 
TypedQuery<T> typedQuery = em.createQuery(query); 
typedQuery.getResultList(); // List<T> 

を編集:明らかに、目を設定するよりよい方法があります外に出ています...

関連する問題