Soru JPA: Birden çok varlıkları döndüren sorgu


Üç 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).

Herhangi bir fikir?

Hibernate 3.x benim JPA sağlayıcımdır.


25
2017-07-29 19:10


Menşei




Cevaplar:


IIRC, yapabilirsin SELECT o1, o2, o3 FROM EntityA o1, EntityB o2, EntityC o3 WHERE ....ve sonuç bir List<Object[3]>dizi içeriklerinin o1, o2, o3 değerlerini içereceği yerler.


37
2017-07-30 00:57



@John: Ayrıca, hql'den kurucuları davet edebilirsiniz, böylece sen de yapabilirsin select new Foo(o1, o2, o3)... ve Liste <Nesne []> yerine bir Liste <Foo> alın. - Ryan Stewart
Tamam, ama eğer bir JPA TypedQuery kullanmak istersem: myEntityManager.createQuery ("o1, o2 ..." yi, <buraya koymak ne?>) - AgostinoX
Aslında her iki listenin birleşimine uygulanacak olan setFirstResult'u kullanmak isterseniz ne yapmalısınız? yani, sorgulanan iki varlığın sonucunun birleşiminin olduğu paginated bir liste döndürmek istiyorum. - Thomas
@Thomas Ne, nasıl SQL UNION? - Tassos Bassoukos
@ Tassos, evet ama varlıklar farklı alanlara sahip olacaklar… daha fazla düşündüğümde kutudan çıkması çok zor görünüyor. Sanırım JPA büyücüsünü hayal ediyorum ... - Thomas


Bu bir Spring Data örneğidir, ancak JPA'da aynı şekilde çalışır

//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);

Sonra bu yöntemi çağırıp sonuçları yazarım:

List<Object[]> lst = courseRepository.getLessonsWithProgress(userId, courseId);
for (Object o[] : lst) {
    Course c = (Course) o[0];
    Lesson l = (Lesson) o[1];
    Progress p = (Progress) o[2];
    User u = (User) o[3];
    //all the classes: Course, Lesson, Progress and User have the toString() overridden with the database ID;    
    System.out.printf("\nUser: %s \n Lesson: %s \n Progress: %s \n Course: %s",u,l,p,c);
}

@Test çıkışı burada:

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 ]

Şerefe


16
2018-05-26 20:58



merhaba Cassion, ama ne durumda sadece sadece Coursname, LessionID, ProgressID ve kullanıcı adı istiyorum .. ne yapmalı? liste verilerinin nasıl ele alınacağı. Çünkü bu sırada bu satır herhangi bir sınıf tarafından durum olamaz - utkal patel
Merhaba Utkal, örnek kodumu düşünerek, 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. - Cassio Seffrin


Sen soruyorsun JPA: Query that returns multiple entitiesEclipseLink de onun altında geliyor. 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);

Ardından, sonuç nesneleri arasında geçiş yapabilir ve bunları uygun bir şekilde yayınlayabilirsiniz.

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

Bunu da 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
2017-09-09 13:52



Yayıncı ve kitaplar 2 varlıktan veri almam gerekiyorsa ne olur? - fiddle