web-dev-qa-db-ja.com

JPAで外部キーを使用するFindBy

プロジェクトに次の3つのエンティティがあります。

@Entity
public class Review {
    @Id
    @GeneratedValue
    private int reviewId;

    @OneToMany(mappedBy="review", cascade = CascadeType.ALL)
    private List<Comment> comments;

    @ManyToOne
    private User user;
}

@Entity
public class Comment {
    @Id
    @GeneratedValue
    private int commentId;

    @ManyToOne
    private Review review;

    @ManyToOne
    private User user;
}

@Entity
public class User {
    @Id @GeneratedValue
    private Long userId;

    @OneToMany(mappedBy="user", cascade = CascadeType.ALL)
    private List<Comment> comments;

    @OneToMany(mappedBy="user", cascade = CascadeType.ALL)
    private List<Review> reviews;
}       

JPAを使用して特定のCommentのすべてのReviewをフェッチしたいので、各Reviewのページの下に、コメントしたUserの名前と実際のCommentを表示できます。だから私がページにアクセスするとhttp://localhost:8080/review/view/5、レビューに対するすべてのコメントに加えて、コメントを追加したユーザーの名前とともにレビューを表示できるようにしたいと思います。

これはSQLを自分で書かなくても達成できますか?はいの場合、どのように?

5
joe11093

Spring Data JPAリポジトリでエンティティグラフを使用します。

@EntityGraph(value = "Review.comments", type = EntityGraphType.FETCH)
public Review findByReviewId(int id);

または、@ Queryを明示的に定義します。

@Query("from Review r inner join fetch r.comments where r.reviewId = :id")
User findByReviewId(@Param("id") int id);
8
Maciej Kowalski