2013-10-01 7 views
0

У меня есть 3 стола: студент, курс и студент_курс. У каждого учащегося может быть несколько курсов, и у каждого курса может быть несколько учеников. (Много-ко-многим). Мне нужно написать метод, который получит всех студентов курса. В SQL это 2 внутренних соединения. Я попытался это:Hibernate join 3 tables

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

Можете ли вы убедиться, что в этом случае у вас есть правильное отображение гибернации? Если вы правильно определили, вам не нужно использовать таблицу сопоставления student_course в запросе.

классы сущностей должны выглядеть

class Student { 

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


} 

class Course{ 

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

отображение Hibernate обеспечившего (Для курса Entity он должен иметь студент установлены)

<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

как он будет знать, что это за идентификатор? (курс = (курс) session.load (Course.class, user_id);) –

+0

Вам нужно указать сопоставление между столбцами таблицы и Java Entity. См. 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

Я рад, что вы поняли это. Если бы это помогло вам, возможно, захотите подтвердить это путем. – luksch