2016-08-22 66 views
0

我是Hibernate的新手,我想弄清楚如何查询映射为实体的多对多关系,因为需要额外的列。休眠查询与多列到多关系

特别地,下面的我发现在codejava.net(http://www.codejava.net/frameworks/hibernate/hibernate-many-to-many-association-with-extra-columns-in-join-table-example)的例子中我这样映射的关系:

Student.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 
} 

Course.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中产生工作查询。

预先感谢您。

回答

0

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

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

它会不会对条款的工作。 –

+1

请给你的答案添加一些解释。在SO上不鼓励使用仅有代码的答案。谢谢。 –

+0

这种方法很有效,我喜欢它,因为它不需要子查询,而且非常简洁。所以我接受了这个答案,即使@omkar sirra提出的答案也在工作。不幸的是,我没有足够的声望来提高你的答案omkar,但无论如何感谢你。 –

0
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和年

更新

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

可能是一种更清洁的方法,即使再次,我更喜欢@Leonardo Luiz的答案,因为他不直接查询加入表,但他从课程表开始,然后进行连接。无论如何,再次感谢您的耐心和时间。 –

+0

我不与别人竞争答案:D。谢谢! –