web-dev-qa-db-ja.com

JPA:複数のエンティティを返すクエリ

3つのテーブルにまたがるJPQLクエリを書いています。私の結果リストでは、一致する行ごとに3つのエンティティすべてを取得したいと思います(それが理にかなっていることを願っています)。

何か案は?

Hibernate 3.xは私のJPAプロバイダーです。

31
Justin Kredible

IIRC、あなたはSELECT o1, o2, o3 FROM EntityA o1, EntityB o2, EntityC o3 WHERE ....、結果はList<Object[3]>、配列の内容にはo1、o2、o3値が含まれます。

41

これはSpring Dataのサンプルですが、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);

次に、このメソッドを呼び出して結果を出力します。

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は次のとおりです。

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 ]

乾杯

23
Cassio Seffrin

多対1または1対多の関係の場合、1つのエンティティの複数のレコードを取得する方法は? Aが1つのエンティティであり、Bが別のエンティティであるが、1対多の関係があるとしましょう。私のクエリは以下のとおりですが、2番目のエンティティの複数のレコードを取得する方法がわかりませんか?

@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