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.
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.
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é
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);