【问题标题】:JPQL Multiple Left Joins on Unrelated ClassesJPQL 不相关类的多个左连接
【发布时间】:2023-03-27 08:22:02
【问题描述】:

我有三个带有列的表(假名):

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...

如果学生没有,这些字段有时可能为空。

问题是most examples 会有 STUDENT 包含其他表的 ID,我没有那个选项。

我尝试了类似的方法(输出到一个新的 obj,该 obj 包含用于加入这个东西的所有 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

我什至不知道该怎么做。

【问题讨论】:

    标签: java sql jpa jpql


    【解决方案1】:

    您应该将另外两个表映射为每个学生可能包含 0..n 行的列表。

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

    然后 StudentUniqueInfo.javaStudentOtherInfo.java 将各有一个字段

     @JoinColumn(name = "STUDENT_ID")
     private Student student;
    

    【讨论】:

    • 这很有意义,而且会很可爱,而不是写一些疯狂的 JPQL。我现在要试试这个。
    • 你回答 100% 有效。我只是好奇是否有办法让它返回学生列表,为每个不同的 other_info 返回一个不同的行项目。因此,如果一名学生有 5 个 other_info。我会取回 5 行。我可以轻松地手动编写代码,但我想我会检查一下。不管怎样,谢谢!
    • 从未做过,但请查看这篇文章,了解有关在多个表中映射一个类的一些想法。 stackoverflow.com/questions/22668350/…
    猜你喜欢
    • 2012-09-12
    • 2013-12-28
    • 2019-10-01
    • 2015-03-04
    • 2015-07-18
    • 2014-08-08
    • 2015-05-23
    • 2018-11-01
    • 2012-04-11
    相关资源
    最近更新 更多