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)。
修正方案
- 替换JPQL中的表/列名为实体类/属性名
- 移除
nativeQuery = true,让框架解析JPQL语句 - 确认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
相关产品推荐
相关产品推荐

