不相关 类 上的 JPQL 多个左连接
JPQL Multiple Left Joins on Unrelated Classes
我有三个包含列的表(错误的假名):
STUDENT (student_id)
STUDENT_UNIQUE_INFO (student_unique_info_id, student_id)
STUDENT_OTHER_INFO (student_other_info_id, student_id)
我希望我可以更改架构,但我不能。
有些同学没有unique_infoand/orother_info.
我的结果集是这样的:
STUDENT_ID | STUDENT_UNIQUE_INFO_FIELDS... | STUDENT_OTHER_INFO_FIELDS...
如果学生没有任何字段,字段有时可能为空。
问题是 most examples 会让 STUDENT 包含其他表的 ID,我没有那个选项。
我尝试了类似的东西(输出到一个新的对象,它包含了用于连接这个东西的所有 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
我只是有点不知道该怎么做。
您应该将其他两个表映射为列表,每个学生可以包含 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;
我有三个包含列的表(错误的假名):
STUDENT (student_id)
STUDENT_UNIQUE_INFO (student_unique_info_id, student_id)
STUDENT_OTHER_INFO (student_other_info_id, student_id)
我希望我可以更改架构,但我不能。 有些同学没有unique_infoand/orother_info.
我的结果集是这样的:
STUDENT_ID | STUDENT_UNIQUE_INFO_FIELDS... | STUDENT_OTHER_INFO_FIELDS...
如果学生没有任何字段,字段有时可能为空。
问题是 most examples 会让 STUDENT 包含其他表的 ID,我没有那个选项。
我尝试了类似的东西(输出到一个新的对象,它包含了用于连接这个东西的所有 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
我只是有点不知道该怎么做。
您应该将其他两个表映射为列表,每个学生可以包含 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;