2013-10-01 120 views
0

我有3个表格:学生,课程和Student_Course。每个学生可能有几门课程,每门课程可能有几个学生。 (很多对多)。我需要写一个能够让所有学生学习课程的方法。在SQL中它是2个内部连接。我尝试这样做:Hibernate加入3个表格

Criteria criteria = session.createCriteria(Student.class, "s"); 
     criteria.createAlias("student_course", "s_c"); 
     criteria.createAlias("course", "c"); 
     criteria.add(Restrictions.eq("s.student_id", "s_c.student_id")); 
     criteria.add(Restrictions.eq("s_c.course_id", "c.course_id")); 
     criteria.add(Restrictions.eq("c.course_id", course.getId())); 
     courses = criteria.list(); 

但我得到一个org.hibernate.QueryException: could not resolve property: student_course of: com.example.entity.Student

@Entity 
@Table(name = "STUDENT") 
public class Student { 

@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "STUDENT_ID", unique = true, nullable = false) 
private long id; 

@ManyToMany(targetEntity = Course.class, fetch = FetchType.EAGER) 
@JoinTable(name = "STUDENT_COURSE", joinColumns = { @JoinColumn(name = "student_id") }, inverseJoinColumns = { @JoinColumn(name = "course_id") }) 
private Set<Course> courses = new HashSet<Course>(); 

和:

@Entity 
@Table(name = "COURSE") 
public class Course{ 
@Id 
@GeneratedValue(strategy = IDENTITY) 
@Column(name = "COURSE_ID", unique = true, nullable = false) 
private long id; 

如何编写正确的代码?

+0

你可以发布你的学生课吗? –

+0

为了回答这个问题,我们需要知道你是如何建模关系的。所以请提供带注释的课程。也许你只需要阅读http://viralpatel.net/blogs/hibernate-many-to-many-annotation-mapping-tutorial – luksch

+0

我发布的代码在 –

回答

0

你能确保在这种情况下你有正确的hibernate映射吗?如果正确定义,则不需要在查询中使用student_course映射表。

实体类应该像

class Student { 

... 
. 
.. 
private Set<Course> courses= new HashSet<Course>(0); 


} 

class Course{ 

private Set<Student > categories = new HashSet<Student >(0); 
} 

Hibernate映射应该有(对于课程的实体,应该让学生设置)

<set name="courses" table="student_course" 
      inverse="false" lazy="true" fetch="select" cascade="all" > 
      <key> 
       <column name="STUDENT_ID" not-null="true" /> 
      </key> 
      <many-to-many entity-name="com....Course"> 
       <column name="COURSE_ID" not-null="true" /> 
      </many-to-many> 
     </set> 

然后您检索过程和使用一套学生

session = HibernateUtil.getSessionFactory().openSession(); 
     course= (Course)session.load(Course.class, user_id); 
     course.getStudents(); 

/Mukesh

+0

它将如何知道这个ID是什么? (course =(Course)session.load(Course.class,user_id);) –

+0

您需要指定表列和Java实体之间的映射。请参阅http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example/ – Mukesh

+0

在代码片段课程=(课程)session.load(Course.class,11); 11课程编号 – Mukesh

1

我想你应该在你的Course

@ManyToMany(mappedBy="courses") 
private Set<Student> students = new HashSet<Student>(); 

这是怎么多对多的关系通常是仿照添加此标注。现在,您可以轻松访问课程的学生。

+0

以下谢谢。这表明我正确的想法 –

+0

我很高兴你能弄明白。如果这有助于您可能想要通过upvoting来承认。 – luksch