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

JPQL构造函数查询分组求和报错,移除nativeQuery仍无法解析实体

解决Spring Data JPA分组求和并映射DTO的问题

问题根源

  • 启用nativeQuery = true时,执行的是原生SQL,但SELECT new 包名.DTO(...)是JPQL专属的DTO构造语法,原生SQL不支持这种写法,导致SQL语法错误。
  • 移除nativeQuery = true后用JPQL,你写的smoke是数据库表名,而JPQL要求使用实体类名(比如你的实体类应该是Smoke,首字母大写),属性名也要对应实体类的字段名(而非数据库列名,比如smokedDate而非smoked_date)。

修正方案

  1. 替换JPQL中的表/列名为实体类/属性名
  2. 移除nativeQuery = true,让框架解析JPQL语句
  3. 确认DTO构造函数参数类型与查询返回类型匹配(SUM(s.quantity)返回Long,你的DTO参数类型正确)

修正后的查询代码

@Query(value = "SELECT new com.eminyilmazz.smoketracker.dto.ActivityBasedQuantity(s.activity, SUM(s.quantity)) " +
               "FROM Smoke s " +
               "WHERE s.smokedDate BETWEEN :beginDate AND :endDate " +
               "GROUP BY s.activity")
List<ActivityBasedQuantity> getTotalQuantityGroupedByActivityWithMinuteInterval(
    @Param("beginDate") LocalDateTime beginDate, 
    @Param("endDate") LocalDateTime endDate);

注意事项

  • 确认实体类名为Smoke(对应数据库表smoke),实体类中日期字段名为smokedDate(对应数据库列smoked_date),如果你的实体类字段名不同,替换为实际字段名即可。
  • 确保DTO的全类名拼写正确,构造函数的参数顺序必须和JPQL中SELECT的字段顺序完全一致。

内容的提问来源于stack exchange,提问作者Emin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:15:54