プロジェクトに次の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を自分で書かなくても達成できますか?はいの場合、どのように?
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);