如何使用Spring Query DSL统计日期字段的去重年份数量
错误根因
该报错来自Hibernate 5.4.x版本的JPQL解析限制,无法正确识别count(distinct year(字段名))这类嵌套函数写法,你用QueryDSL链式调用生成的HQL刚好触发了这个解析缺陷。
无需原生SQL的解决方案
方案1:拆分表达式声明
把年份提取和去重计数的逻辑拆分开定义,避免链式调用生成的语法异常:
// 先声明年份提取表达式 NumberExpression<Integer> yearExpr = qTestEntity.createdDate.year(); // 对年份表达式做去重计数,用fetchOne拿单个返回值 Long distinctYearCount = queryFactory.select(yearExpr.countDistinct()) .from(qTestEntity) .fetchOne();
这个方案和你原有逻辑的执行效率完全一致,只是调整了QueryDSL表达式的声明方式来适配Hibernate的解析规则。
方案2:分组统计实现
如果方案1仍不生效,可以按年份分组后统计分组数量来实现需求:
Long distinctYearCount = queryFactory.select(qTestEntity.createdDate.year()) .from(qTestEntity) .groupBy(qTestEntity.createdDate.year()) .fetchCount();
该方案利用分组自动去重的特性,统计出来的分组行数就是去重后的年份数量,兼容性更好。
补充说明
你原有代码用List接收计数结果的写法存在问题,countDistinct返回的是单个数值,应该用fetchOne()获取返回值,类型为Long。
内容的提问来源于stack exchange,提问作者java dev
相关产品推荐
相关产品推荐

