2016-02-11 4 views
-1

Мне нужно сделать запрос на соединение от 3-х столов профессора, преподавателя и студентов. У каждого профессора есть список учителей, и у каждого учителя есть список учеников. Я работаю над веб-сервисом, который даст мне только профессора id и основы для того, что мне нужно получить всех студентов для этого конкретного профессора. Поэтому мне сначала нужно будет получить список учителей, а затем я смогу получить всех учеников. Любой может помочь в этом? Я не хочу использовать каскадный выбор. Я хочу использовать JOIN FETCH, потому что я использую jpa.Query - Join from 3 tables

Таблица Профессор: Профессор номер, имя Prof, Prof адрес

Таблица Учитель: ID Преподаватель, профессор И.Д., имя учителя

Таблица студент: Student ID, учитель номер, имя Студент, студент адрес

+1

Просьба представить схему таблиц, чтобы люди могли лучше понять ваш вопрос. – Joyson

+0

см. Обновленное сообщение – Alina

ответ

2

Вот запрос JPA для вашего требования. Обратите внимание, что StudentModel должен отображаться в таблицу учеников. StudentModel должен иметь свойство «учитель», которое является типом «TeacherModel». TeacherModel должен иметь свойство «профессор», тип которого «ProferssorModel», тогда только это работает.

<query name="findStudentsByProfessorID"> 
    <query-param name="professorId" type="Long" /> 
     SELECT student 
     FROM StudentModel student 
     inner join fetch student.teacher teacher 
     inner join fetch teacher.professor professor 
     WHERE professor.id = :professorId 

</query> 

или используя запрос по запросу sql, мы также можем это сделать.

<sql-query name="findStudentsByProfessorID"> 
    <query-param name="professorid" type="long" /> 
    <![CDATA[ 
     select * from student s join teacher t 
     on s.teacherid = t.teacherid where t.professorid = :professorid; 
    ]]> 
</sql-query> 
1

Как вы не упомянули структуру таблицы, самым простым запросом было бы сделать следующее: если у вас есть учитель как иностранный ключ в таблице учеников и профессор как внешний ключ в таблице учителей:

Select * from student s 
    where s.teacherid in 
    (select t.teacherid from teacher t where t.professorid = 1); 

Альтернативой использованию подзапроса/каскадного выбора является использование объединений.

select * from student s join teacher t 
    on s.teacherid = t.teacherid where t.professorid = 1; 
+0

Да, у меня есть профессор id и учитель id, как вы упомянули. Благодарю. Но есть ли альтернатива, кроме каскадного выбора? – Alina

+1

Любая конкретная причина, по которой вы хотите избежать выбора каскада? – Joyson

+0

Это не работает в моем классе jpa. Вы знаете, как использовать JOIN fetch? – Alina