web-dev-qa-db-fra.com

JPA: requête qui renvoie plusieurs entités

J'écris une requête JPQL qui se joint à trois tables. Dans ma liste de résultats, je voudrais obtenir les trois entités par ligne correspondante (j'espère que cela a du sens).

Des idées?

Hibernate 3.x est mon fournisseur JPA.

31
Justin Kredible

IIRC, vous pouvez faire un SELECT o1, o2, o3 FROM EntityA o1, EntityB o2, EntityC o3 WHERE ...., et le résultat sera un List<Object[3]>, où le contenu du tableau contiendra les valeurs o1, o2, o3.

41
Tassos Bassoukos

Il s'agit d'un exemple de Spring Data, mais cela fonctionne de la même manière dans JPA

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

Ensuite, j'appelle cette méthode et j'imprime les résultats:

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

La sortie @Test est ici:

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 ]

À votre santé

23
Cassio Seffrin

En cas de relation plusieurs à un ou un à plusieurs, comment obtenir plusieurs enregistrements de l'une des entités? disons que A est une entité et B est une autre entité mais ils ont une relation un à plusieurs et lorsque vous obtenez un résultat, vous vous attendez à ce que B ait un enregistrement et A ait plus d'un enregistrement? Ma requête est comme ci-dessous mais je ne sais pas comment puis-je obtenir plusieurs enregistrements de la 2ème entité?

@Query("SELECT wl, gr FROM WatchList as wl, GeozoneReference gr " +
            "WHERE wl.watchlistId = gr.objWatchList.watchlistId " +
            "AND wl.watchlistId =:watchlistId")
    List<Object[]> findWatchlistByWatchlistId(@Param("watchlistId") Long watchlistId);
1
Yeshwant KAKAD