2013-10-01 115 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