1

簡単な質問ですが、推論に誤りが見当たりません。行/エンティティ全体ではなく、結果として選択されたメンバーを含む名前付きクエリを持つ。

ここで、便利なタプル メソッドを使用してメンバー フィールドにアクセスしたいと考えています。

q = em.createNamedQuery("test.findvar");
List<Tuple> tuples = q.getResultList();    
for (Tuple t : tuples)
   System.out.println(t.get(0) + " " + t.get(1));

残念ながら、それは私をスローします:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to javax.persistence.Tuple

すべて正常に動作します:

q = em.createNamedQuery("test.findvar");
List<Object[]> objs = q.getResultList();    
for (Object[] obj : objs)
    System.out.println(obj[0] + " " + obj[1]);

私の最初の解決策の何が問題になっていますか?

4

2 に答える 2

4

javadocに記載されているように、createNamedQuery() で戻り値の型を指定できます。

したがって、コードは次のようになります。

q = em.createNamedQuery("test.findvar", Tuple.class);
List<Tuple> tuples = q.getResultList();    
for (Tuple t : tuples)
   System.out.println(t.get(0) + " " + t.get(1));

戻り値の型を指定すると、 Queryインスタンスの代わりにTypedQueryインスタンスが作成されます。クエリはジェネリックを使用せず、単純に java.util.List を返します。

于 2013-04-30T09:55:43.090 に答える