2012-06-19 2 views
1

У меня есть 4 сущности:Hibernate наследования запроса

User, Teacher, Student, Course

и 4 таблицы:

t_user, t_teacher_course, t_student_course, t_course

Teacher и Student расширяет User (с descriminators) и имеют @ManyToMany отношений с Course (User не имеет) Teacher 's отношений хранятся в t_teacher_course и Student' отношения с хранятся в t_student_course.

Теперь я хочу, чтобы выбрать все пользователь с курсами (если они есть) в одном запросе select u from User u left join fetch u.courses c (Обратите внимание, что пользователь не имеет курсы) Это выбор генерируется что-то вроде этого:

select 
    ... 
from 
    T_USER user0_ 
left outer join 
    T_TEACHER_COURSE course1_ 
     on user0_.USERID_=courses1_.TEACHER_ 
left outer join 
    T_COURSE course2_ 
     on courses1_.LANE_=course2_.COURSENAME_ 
where 
    user0_.GROUP_=? 

As вы можете ясно видеть, Hibernate не присоединился к с t_student_course стол

Я использую Hibernate 4.1Final

Вопрос: поддержка ли Hibernate таких запросов

а) если поддерживает, то почему он не сделал надуманные курсы для Student лица?

b) если вы не поддерживаете, как я могу выбрать всех пользователей с их курсами, используя JPQL?

ответ

2

С u.courses может быть student.courses или teacher.courses, Hibernate решает неоднозначность, выбирая первый (или последний) ассоциацию с этим именем в его метаданных.

Это может сработать, если имя коллекции courses не является одинаковым в обоих подклассах. Например, вы можете определить Student.attendedCourses и Teacher.teachedCourses.

В противном случае вам нужно будет выпустить два запроса (один для учителей и один для учащихся) и присоединиться к спискам результатов. Или вам придется подтянуть ассоциацию в объекте User.

+0

Uau! Переименование полей решило проблему! Большое спасибо! Перед тем, как ответить, мне нужно было сделать 3 выбора. Я думаю, что Hibernate должен предупреждать о ** двусмысленности ** –

Смежные вопросы