2013-03-14 3 views
7

このクエリをTypedQueryとして記述し、2つのLongを2つの公開Longフィールドがあるオブジェクトに実行させることは可能ですか?JPAの通常のクエリではなくTypedQuery

Query q = em.createQuery(
      "SELECT c.id, COUNT(t.id) " + 
      "FROM PubText t " + 
      "JOIN t.comm c " + 
      "WHERE c.element = ?1 " + 
      "GROUP BY c.id"); 
    q.setParameter(1, e); 
    List<?> rl = q.getResultList(); 
    Iterator<?> it = rl.iterator(); 
    HashMap<Long, Long> res = new HashMap<Long, Long>(); 
    while (it.hasNext()) { 
     Object[] n = (Object[]) it.next(); 
     res.put((Long)n[0], (Long)n[1]); 
    } 
    return res; 

答えて

12

JPAは、まさにこのための機能を持っている - コンストラクタ式:

Query q = entityManager.createQuery("SELECT NEW com.example.DTO(c.id, COUNT(t.id)) FROM ..."); 
List<DTO> dtos = q.getResultList(); 

あなたのDTOクラスはPOJOすることができます。必要なのは、2 Longを受け入れる公共のコンストラクタだけです。 NEWオペレータの後に、クラスの完全修飾名を指定する必要があります。

+0

こんにちは@kostjaエラーが発生しました(複数の返品でクエリのTypedQueryを作成できません)。私のSQLは次のようになっています: 'SELECT NEW com.company.ui.EntityIDKey(c.companyId、c.name)会社cからc.companyIdはnullではなく、c.nameはnullでなくlength(trim(c.name ))> 0 order by c.name asc'。私は次のようにTypedQueryを使用しています: 'List companies = getEntityManager()。createQuery(sql、EntityIDKey.class).getResultList();' –

+1

EntityIDKeyがエンティティでない場合、これが当てはまります。プロバイダはそのようなクエリを自由にサポートしています。あなたは通常のクエリを使ってみましたか? – kostja

+0

が真である場合、 'EntityIDKey'はエンティティではありません。私はHibernateプロバイダを使用していて、何とかそれが動作すると推定しています。 'Company'のコレクションを構築する通常のクエリはうまくいきます。 –

8

新しいコードは次のようになります。 ありがとうございます。

TypedQuery<CommUsed> q = em.createQuery(
     "SELECT new CommUsed(c.id,COUNT(t.id)) " + 
     "FROM PubText t " + 
     "JOIN t.comm c " + 
     "WHERE c.element = ?1 " + 
     "GROUP BY c.id", CommUsed.class); 
    q.setParameter(1, e); 
    HashMap<Long, Long> res = new HashMap<Long, Long>(); 
    for (CommUsed u : q.getResultList()) 
     res.put(u.commID, u.cnt); 
+0

私は知っているので、あなたはTypedQueriesを使えます。残念ながら、クエリから 'Map'を補う合理的な方法はないようです。そのため、最後の3行の変換部分は残っていなければなりません。 – kostja

+1

Ach、それは大丈夫です。古いC日のようにすべてを1行にする必要はありません。 :-) –

+0

@HasanTuncayなぜ@kostjaが提案するコンストラクタ式の機能を活用していませんか? –

関連する問題