Отображение гибернации через другую сущность - PullRequest
3 голосов
/ 10 февраля 2010

Рассмотрим эту простую схему базы данных:

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

[1   *] = 1 to many relationship 

Я создал объекты для объектов «Пользователь», «Курс» и «Студент» и настроил следующие сопоставления:

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? Является ли именованный запрос моей единственной опцией?

Ответы [ 3 ]

1 голос
/ 10 февраля 2010

Я думаю, вы должны определить fetchType = EAGER в курсе, что на самом деле не очень хорошая идея так что HQL будет лучшим и эффективным.

0 голосов
/ 10 февраля 2010

Вы сказали

Я хочу, чтобы можно было найти всех студентов на всех курсах , преподаваемых конкретным пользователем

Использовать 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

С уважением,

0 голосов
/ 10 февраля 2010

Вы можете сделать следующее:

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

Однако это было бы очень неэффективно (см. Проблему " SELECT N + 1 ")

У меня не было возможности протестировать его, но ваш именованный запрос должен выглядеть примерно так: "ВЫБЕРИТЕ c.students ИЗ КУРСА c ГДЕ c.user.name = 'username'"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...