【问题标题】:Multiple JOIN with JPA使用 JPA 进行多次 JOIN
【发布时间】:2019-07-17 08:41:51
【问题描述】:

我有 3 个实体组,学生 (1 - ∞) 和学生评分 (1 - ∞)

@Entity
@Table(name = "`group`")
public class Group implements Serializable {
    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_group")
    private List<Student> students;
}

学生

@Entity
@Table(name = "student")
public class Student implements Serializable {
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinColumn(name = "id_student")
    public List<Rating> ratings;

    @ManyToOne
    @JoinColumn(name = "id_group")
    private Group group;
}

评分

@Entity
@Table(name = "rating")
public class Rating implements Serializable {
    @Temporal(TemporalType.DATE)
    @Column
    private Date date;

    @ManyToOne
    @JoinColumn(name = "id_student")
    public Student student;
}

我的目标是选择所有 grop by id 与学生评分在 2 个日期之间的学生。 我尝试过的解决方案

 @Query(value = "select g from Group g INNER JOIN g.students s ON g.id = :id INNER JOIN s.ratings r ON r.student.id = s.id and r.date between :dateStart and :dateEnd GROUP BY g.id")

 @Query(value = "SELECT * FROM Group g INNER JOIN student ON g.id_group = :id RIGHT JOIN rating on student.id_student = rating.id_student and rating.`date` between :dateStart and :dateEnd GROUP BY g.id_group",nativeQuery = true)

 @Query(value = "select g from Group g WHERE g.id = :id and g.students IN (select s from g.students s JOIN s.ratings r where r.date between :dateStart and :dateEnd) GROUP BY g.id")

【问题讨论】:

  • 问题在哪里?
  • 也放置Rating 类。
  • @MohsenR.Aqdam 添加了
  • @AndrianekenaMoise 问题来自我尝试过的目标和解决方案。如果你想让我复制它,我会做的。

标签: java mysql hibernate jpa spring-data-jpa


【解决方案1】:

您的 @OneToMany 映射错误。使用@OneToMany(mappedBy="ratings") 而不是@JoinColumn。见https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Example_of_a_OneToMany_relationship_and_inverse_ManyToOne_annotations

在 JPQL 中不需要加入 ON 条件。 JPA 会根据外键自动完成:

select g from Group g 
JOIN g.students s 
JOIN s.ratings r 
WHERE  g.id = :id 
AND r.date between :dateStart and :dateEnd

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    相关资源
    最近更新 更多