【问题标题】:Hibernate join 3 tables休眠连接3个表
【发布时间】:2013-10-01 08:43:49
【问题描述】:

我有 3 个表:Student、Course 和 Student_Course。每个学生可能有几门课程,每门课程可能有几个学生。 (多对多)。我需要编写一种方法来获得课程的所有学生。在 SQL 中,它是 2 个内部连接。我试过这个:

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;

如何编写正确的代码?

【问题讨论】:

  • 你能发布你的学生课程吗?
  • 要回答这个问题,我们需要知道您如何为关系建模。所以请提供带注释的类。也许你只需要阅读viralpatel.net/blogs/…

标签: java hibernate many-to-many criteria


【解决方案1】:

我认为您应该在 Course 类中添加此注释

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

这是通常建模的多对多关系。现在,您可以非常轻松地访问课程的学生。

【讨论】:

  • 我很高兴你能弄明白。如果这对您有帮助,您可能需要通过投票来表示感谢。
【解决方案2】:

您能否确保在这种情况下您拥有正确的休眠映射?如果定义正确,则不需要在查询中使用 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();

/穆克什

【讨论】:

  • 它如何知道这个 id 是什么? (course= (Course)session.load(Course.class, user_id);)
  • 需要指定Table列与Java Entity的映射关系。参考mkyong.com/hibernate/…
  • 在sn-p course= (Course)session.load(Course.class, 11); 11 是课程编号
  • 谢谢。我解决了这个问题。我添加到课程类学生集。我尝试了 session.load 和 session.get
猜你喜欢
  • 1970-01-01
  • 2016-09-07
  • 2021-11-12
  • 1970-01-01
  • 2012-07-05
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多