JPQL множественные левые соединения на несвязанных классах - PullRequest
0 голосов
/ 17 января 2019

У меня есть три таблицы со столбцами (неправильные поддельные имена):

STUDENT (student_id)
STUDENT_UNIQUE_INFO (student_unique_info_id, student_id)
STUDENT_OTHER_INFO (student_other_info_id, student_id)

Хотелось бы изменить схему, но не могу. У некоторых учеников нет unique_info и / или other_info.

Мой набор результатов будет выглядеть так:

STUDENT_ID | STUDENT_UNIQUE_INFO_FIELDS... | STUDENT_OTHER_INFO_FIELDS...

Где поля могут иногда быть нулевыми, если у студента их нет.

Проблема в В большинстве примеров будет иметь СТУДЕНТ, содержащий идентификаторы других таблиц, у меня нет этой опции.

Я пробовал что-то вроде (вывод в новый объект, который принимает все 3 таблицы, используемые для объединения этой вещи)

SELECT NEW path.to.outputObj(S,
       (SELECT SUI
       FROM path.to.SUI SUI
       WHERE S.studentId = SUI.studentId),
       (SELECT SOI
       FROM path.to.SOI SOI
       WHERE S.studentId = SOI.studentId))
       FROM STUDENT S

Но он взорвался, потому что у некоторых студентов есть несколько записей в student_other_info.

java.sql.SQLException: Subquery returns more than 1 row

Я просто немного растерялся из-за того, как это сделать.

1 Ответ

0 голосов
/ 17 января 2019

Вы должны отобразить эти две другие таблицы как списки, которые могут содержать 0..n строк для каждого студента.

class Student {
   @OneToMany(mappedBy = "student");
   List<StudentUniqueInfo> studentUniqueInfoList;

   @OneToMany(mappedBy = "student");
   List<StudentOtherInfo> studentOtherInfoList;
   ...
}

А затем StudentUniqueInfo.java и StudentOtherInfo.java каждый будет иметь поле

 @JoinColumn(name = "STUDENT_ID")
 private Student student;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...