【问题标题】:Hibernate query on many to many relationship with extra column休眠查询与额外列的多对多关系
【发布时间】:2016-08-24 03:38:51
【问题描述】:

我是 Hibernate 的新手,由于需要额外的列,我正试图弄清楚如何查询映射为实体的多对多关系。

特别是,按照我在 codejava.net (http://www.codejava.net/frameworks/hibernate/hibernate-many-to-many-association-with-extra-columns-in-join-table-example) 上找到的示例,我将关系映射如下:

学生.java

@Entity
public class Student implements Serializable {

    @Id
    @Column
    private String email;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String surname;

    // Constructor, getters, setters, hashcode, equals
 }

课程.java

@Entity
@Table( 
    uniqueConstraints = @UniqueConstraint(
                            columnNames {"name","year"})
)
public class Course implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private long id;

    @Column
    private String name;

    @Column
    private String year;

    @OneToMany(mappedBy = "course")
    private Set<Student_Course> students = new LinkedHashSet<>();

    // Constructor, getters, setters, hashcode, equals
}

Student_Course.java

@Entity
public class Student_Course implements Serializable {

    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    @Column
    private long id; 

    @ManyToOne
    @JoinColumn(name = "student_email")
    private Student student;

    @ManyToOne
    @JoinColumn(name = "course_id")
    private Course course;

    @Column(nullable = false,
            columnDefinition = "int default 0")
    private int score;

    // Constructor, getters, setters, hashcode, equals
}

现在我想要实现的是通过 hql 查询找出参加给定课程的学生的姓名和姓氏(我知道课程的名称和年份)。 我知道这可能很容易,但我无法在 HQL 中生成有效的查询。

提前谢谢你。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    我相信这个查询可以做你想做的事:

    SELECT sc.student.name, sc.student.surname
    FROM Course c JOIN c.students sc 
    WHERE c.name = :name AND c.year = :year
    

    【讨论】:

    • 请为您的答案添加一些解释。 SO不鼓励仅使用代码的答案。谢谢。
    • 这种方法很有效,我喜欢它,因为它不需要子查询并且非常简洁。因此,即使@omkar sirra 提出的答案也有效,我也接受了这个答案。不幸的是,我没有足够的声望来支持你的回答 omkar,但还是谢谢你。
    • 感谢您提醒我@Andrea marcolin。我个人不喜欢加入,因为我觉得它增加了时间复杂度。我现在删除了子查询并优化了查询
    • @omkarsirra 它可以在没有 On 子句的情况下工作,因为 Hibernate 可以自动处理。
    • 感谢您的回复@Leonardo Luiz
    【解决方案2】:
    Select name, surname from Student where email in 
    (Select student.email from Student_Course 
    where Student_course.course.name=:courseName and Student_course.course.year= :year)
    

    然后设置 courseName 和 year

    更新

    Select student.name,student.surname from Student_Course 
    where Student_course.course.name=:courseName and Student_course.course.year= :year
    

    【讨论】:

    • 可能是一种更简洁的方法,即使我更喜欢@Leonardo Luiz 的回答,因为他不直接查询连接表,而是从 Course 表开始,然后进行连接。无论如何,再次感谢您的耐心和时间。
    • 我不是在和其他人竞争答案:D.Thanks!
    猜你喜欢
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多