2011-07-29 12 views
24

Üç tabloya katılan bir JPQL sorgusu yazıyorum. Sonuç listemde, eşleşen sıraya göre üç varlığın tümünü almak istiyorum (bu da mantıklıdır).JPA: Birden çok varlık döndüren sorgu

Herhangi bir fikrin var mı?

Hazırda bekletme 3.x benim JPA sağlayıcımdır.

cevap

35

IIRC, bir SELECT o1, o2, o3 FROM EntityA o1, EntityB o2, EntityC o3 WHERE .... yapabilir ve sonuç, dizi içeriğinin o1, o2, o3 değerlerini içereceği bir List<Object[3]> olacaktır.

+6

@John: Ayrıca, hql gelen kurucular çağırabilir, ayrıca 'yeni Foo (O1, O2 seçerim böylece, o3) ... 've Listesinin bir listesi yerine Listesini alın. –

+3

Tamam, ama eğer bir JPA TypedQuery kullanmak istersem: myEntityManager.createQuery ("o1, o2 ...", ) – AgostinoX

+0

Eğer gerçekten de geçerli olan setFirstResult kullanmak isterseniz her iki listenin birleştirilmesi? yani, sorgulanan iki varlığın sonucunun birleşiminin olduğu paginated bir liste döndürmek istiyorum. – Thomas

0

JPA: Query that returns multiple entities'u sorduğunuz için EclipseLink de altındadır. Ve EclipseLink için bu soruya ulaştım. İşte benim çözümüm. Umarım senin için çalışır.

TypedQuery<Object[]> query = entityManager.createQuery("select p from Post p where p.publisher.pubId= :ID order by p.createdAt desc", 
       Object[].class); 
query.setParameter("ID", publisherID); 

Sonra sonuç nesneler aracılığıyla döngü ve onları uygun şekilde yayınlayabilirsiniz.

for (Object result : query.getResultList()) { 
      myList.add((Post) result); 
     } 

Ayrıca bu deneyebilirsiniz,

Query query = entityManager.createQuery("select p from Post p where p.publisher.pubId= :ID order by p.createdAt desc"); 

Referans: http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL

+0

Yayıncı ve kitap olarak 2 varlıktan veri almam gerekiyorsa ne olur? – fiddle

16

Bu Bahar Veri örneği, Sonra

//HQL query 
@Query("SELECT c,l,p,u FROM Course c, Lesson l, Progress p, User u " 
      + "WHERE c.id=l.courseId AND l.id = p.lessonId AND p.userId = u.id AND u.id=:userId AND c.id=:courseId") 
    public List<Object[]> getLessonsWithProgress(@Param("userId") Integer userId, @Param("courseId")Integer courseId); 

JPA ancak onun eserleri aynı şekilde , Bu yöntemi çağırıp sonuçları yazdır:

çıkışı @Test 0 buradadır:

User: com.cassio.dao.model.User[ id=1965 ] 
Lesson: com.cassio.dao.model.Lesson[ id=109 ] 
Progress: com.cassio.dao.model.Progress[ id=10652 ] 
Course: com.cassio.dao.model.Course[ id=30 ] 

Alkış

+0

Merhaba Cassion, ama ne de sadece Coursname, LessionID, ProgressID ve kullanıcı adı istiyorum. Ne yapmalı? liste verilerinin nasıl ele alınacağı.O zaman bu satır –

+0

Hi Utkal tarafından herhangi bir sınıf olamayacağından, örnek kodumu dikkate alarak, Ders, Ders, İlerleme ve Kullanıcı nesneleridir. Her sınıfın istenen String veya Tamsayıyı @Override toString() yöntemine alabilirsiniz. Bu arada, bu durumda en iyi uygulama HQL sorgusunu değiştirir, bunun yerine Ders c'yi alırsınız, bu şekilde c.name, l.id, progress.id ve u.firstname FROM ... Karmaşık nesneler yerine Dizeleri ve Tamsayıları alır. –