Spring Data中JPQL查询是否不允许使用嵌套DTO?
嵌套DTO在JPQL中的使用与语法错误修复
首先明确:JPQL完全支持嵌套DTO构造,你的核心思路是可行的,报错是因为JPQL语句存在语法疏漏,我们一步步来修正:
你的语法错误分析
你提供的JPQL有两处关键的括号缺失问题,导致Hibernate解析时抛出QuerySyntaxException:
- 外层
CategoryCounter的构造函数调用没有闭合括号:你在写完new test.customresult.CarResult(COUNT(e.category), e.category)后,没有补上外层构造的右括号就直接写了FROM - 整体SELECT语句的括号匹配不完整,破坏了JPQL的语法结构
修正后的JPQL代码
@Query("SELECT new test.customresult.CategoryCounter(c.name, " + "new test.customresult.CarResult(COUNT(e.category), e.category)) " + "FROM error e JOIN e.car c " + "GROUP BY c.name, e.category") List<CategoryCounter> countErrors();
额外注意事项
- 确保你的两个DTO类(
CategoryCounter和CarResult)都有与JPQL构造参数顺序、类型完全匹配的公开构造函数,这是JPQL能够成功实例化DTO的必要前提 - GROUP BY子句中的字段必须覆盖SELECT中所有非聚合函数的字段,你的代码里
c.name和e.category都在GROUP BY里,这部分是符合规范的
内容的提问来源于stack exchange,提问作者ThomasW
相关产品推荐
相关产品推荐

