2013-03-14 21 views
7

Bu Sorguyu bir Yazımsal Sorgu olarak yazmak mümkün ve iki Long'un, içinde iki ortak Long alanı bulunan bir Object'e yazmasına izin verilebilir.TypedQuery, JPA içinde normal Query yerine

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; 

cevap

12

JPA sadece bunun için bir özelliği vardır - yapıcı ifadeler:

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

Sizin DTO sınıfı bir POJO olabilir. Tüm ihtiyaç duyacağı 2 Long s kabul eden bir kamu kurucusudur. Lütfen NEW operatöründen sonra sınıfınızın tam bir ismini vermeniz gerektiğini unutmayın.

+0

Merhaba @kostja Bir hata alıyorum (Birden çok dönüşle sorgu için TypedQuery oluşturulamıyor). Benim SQL bu gibi görünüyor: 'SEÇİN YENİ com.company.ui.EntityIDKey (c.companyId, c.name) FROM Firma c NEREDE c.companyId null değil ve c.name boş ve uzunluk değil (trim (c.name)))> C.name asc' ile 0 emir. Aşağıdaki gibi bir TypedQuery kullanıyorum: 'List şirketleri = getEntityManager(). CreateQuery (sql, EntityIDKey.class) .getResultList();' –

+1

, bu sizin EntityIDKey'niz bir varlık değilse durum böyle olabilir. Sağlayıcı, bu tür soruları desteklemez. Normal bir Sorgu kullanmayı denediniz mi? – kostja

+0

true, 'EntityIDKey' bir varlık değil. Hazırda bekletme sağlayıcısı kullanıyorum ve bir şekilde çalışacağını varsayar. 'Şirket'in bir koleksiyonunu oluşturan düzenli bir sorgu sadece iyi çalışıyor. –

8

Yeni kod şimdi böyle görünüyor. Yardımlarınız için teşekkürler.

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

Gördüğünüz gibi, TypedQueries'i kullanabilmeniz için :) iyi bilmeniz gerekiyor. Ne yazık ki, sorgudan bir 'Harita' doldurmak için makul bir yol yok gibi görünüyor, bu yüzden son 3 satırda dönüşüm kısmı kalmak zorunda, korkarım. – kostja

+1

Ach, bu iyi. Her şeyi eski C günlerinde olduğu gibi tek bir satırda basmaya ihtiyacımız yok. :-) –

+0

@HasanTuncay neden @kostja tarafından önerilen kurucu ifade özelliğini kullanmadınız? –