FindBy在JPA中使用外键

时间:2018-01-05 22:38:43

标签: java spring jpa orm spring-data-jpa

我的项目中有以下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,这是否可以实现?如果是,怎么样?

1 个答案:

答案 0 :(得分:3)

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