2010-02-10 164 views
3

考虑一个简单的数据库模式:Hibernate映射通过另一个实体

User    Course    StudentCourse  Student 
+-------------+  +-------------+  +-------------+  +-------------+ 
| -user_id |1 *| -course_id |1 *| -course_id |* 1| -student_id | 
|    |---->| -user_id |---->| -student_id |---->|    | 
+-------------+  +-------------+  +-------------+  +-------------+ 

[1 *] = 1 to many relationship 

我已经创建了一个用户,当然,和Student对象,实体和设置以下映射:

User -> Course - one to many 
Course -> Student - many to many 

在我的Java类我可以通过调用user.getCourses()访问用户的课程,我可以通过调用course.getStudents()访问课程中的所有学生。 我希望能够找到所有的学生在所有的课程user.getCourse().getStudents()教导的所有课程,但因为user.getCourses()返回Collection<Course>我不能在集合上调用course.getStudents()我应该如何使用Hibernate来实现这一点?命名查询是我唯一的选择吗?

回答

1

我想你必须在课程中定义fetchType = EAGER,这实际上不是一个好主意 所以HQL会是最好的和有效的。

0

你可以做到以下几点:

List<Student> students = new ArrayList<Student>(); 
for (Course course : user.getCourses()) 
{ 
    students.addAll(course.getStudents()); 
} 

然而,这将是非常低效的(见“SELECT N+1”的问题)

我还没有机会测试它,但你的命名查询应仅仅是这样的: “选择c.students当然从C,其中c.user.name = '用户名'”

0

你说

我希望能够找到所有的学生在所有由特定用户

使用HQL查询讲授的课程

SELECT DISTINCT _student FROM User AS _user, IN (_user.courses) _course, IN(_course.students) _student WHERE _user.id = :id 

SELECT DISTINCT _student FROM User _user inner join _user.courses _course inner join _course.students _student WHERE _user.id = :id 

问候,