You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data中JPQL查询是否不允许使用嵌套DTO?

嵌套DTO在JPQL中的使用与语法错误修复

首先明确:JPQL完全支持嵌套DTO构造,你的核心思路是可行的,报错是因为JPQL语句存在语法疏漏,我们一步步来修正:

你的语法错误分析

你提供的JPQL有两处关键的括号缺失问题,导致Hibernate解析时抛出QuerySyntaxException:

  1. 外层CategoryCounter的构造函数调用没有闭合括号:你在写完new test.customresult.CarResult(COUNT(e.category), e.category)后,没有补上外层构造的右括号就直接写了FROM
  2. 整体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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:16:01