Spring Data JPA 多表查询的一个小错
条评论在准备一个 JPA 的内容培训,在写多表联查时遇到一个小问题,记录一下。
现在有 3 张表,分别是学生表 Student, 科目表 Subject 和成绩表 Transcript, 成绩 Transcript 通过 subjectId 和 studentId 关联 Student 和 Subject 。代码如下:1
2
3
4" select new TranscriptVO(t,st,s) from TranscriptBean t " // (value =
+ " left join SubjectBean s on t.subjectId = s.id " //
+ " left join StudentBean st on t.studentId = st.id") //
List<TranscriptVO> findAllTranscriptVO();
完成以上接口后测试,启动报错,报错内容如下:
1 | Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate class [TranscriptVO] [ select new TranscriptVO(t,st,s) from com.liulonglong.practice.bean.TranscriptBean t left join com.liulonglong.practice.bean.SubjectBean s on t.subjectId = s.id left join com.liulonglong.practice.bean.StudentBean st on t.studentId = st.id] |
这个问题咱见过,小 Case, 是TranscriptVO
的构造函数和 HQL 中对应不上,检查修改一下即可。检查 TranscriptVO
的构造函数是正确的,如下:
1 | public TranscriptVO(TranscriptBean transcript, StudentBean student, SubjectBean subject) { |
诶?啥情况!
再仔细看看报错信息,第一行中记录了 HQL 在执行时有做转换, 查询的 3 个 Bean 前都加上了包名,但 TranscriptVO 前没有包名,问题应该就在这里,修改 HQL 如下:1
2
3
4" select new com.liulonglong.practice.vo.TranscriptVO(t,st,s) from TranscriptBean t " // (value =
+ " left join SubjectBean s on t.subjectId = s.id " //
+ " left join StudentBean st on t.studentId = st.id") //
List<TranscriptVO> findAllTranscriptVO();
问题解决。
Happy & Done