HQL按小时分组统计查询:hour返回整数的调整需求咨询
解决按小时分组返回格式化小时的问题
嘿,针对你现在用JPA查询返回Integer类型小时的需求,我整理了几个实用的方案,帮你搞定这个问题:
方案1:在SQL层面直接格式化(推荐,减少Java端处理)
如果你用的是MySQL,可以直接用DATE_FORMAT函数把小时转成两位字符串格式,修改你的查询语句就行:
@Query(value = "select sum(PC.count) as pcounts, DATE_FORMAT(PC.time, '%H') as hourly from ProductCount as PC where PC.time >= :currentDate and PC.time < :nextDate group by DATE_FORMAT(PC.time, '%H')") List<Map> findByCountAndGroupByTime(@Param("currentDate") Timestamp currentDate, @Param("nextDate") Timestamp nextDate);
这里%H会返回00-23的两位小时字符串,要是你需要12小时制的话,换成%h就能得到01-12的格式。
方案2:Java代码层面二次处理
要是不想改动SQL,也可以在查询结果返回后,对Integer类型的小时做格式化:
// 先拿到原始查询结果 List<Map> rawResults = productCountRepository.findByCountAndGroupByTime(currentDate, nextDate); List<Map<String, Object>> formattedResults = new ArrayList<>(); // 遍历结果,把小时转成两位字符串 for (Map result : rawResults) { Integer hour = (Integer) result.get("hourly"); String formattedHour = String.format("%02d", hour); // 把1变成"01",23变成"23" Map<String, Object> newResult = new HashMap<>(result); newResult.put("hourly", formattedHour); formattedResults.add(newResult); }
这种方式灵活,适合需要在Java端做更多自定义处理的场景。
方案3:用自定义DTO优雅接收结果
如果希望代码更规整,可以创建一个DTO类来接收查询结果,同时内置格式化逻辑:
// 自定义DTO类 public class HourlyCountDTO { private Long pcounts; private Integer hourly; // 注意构造函数的参数顺序要和查询返回的字段顺序一致 public HourlyCountDTO(Long pcounts, Integer hourly) { this.pcounts = pcounts; this.hourly = hourly; } // 提供获取格式化小时的方法 public String getFormattedHour() { return String.format("%02d", this.hourly); } // 常规的getter和setter public Long getPcounts() { return pcounts; } public Integer getHourly() { return hourly; } }
然后修改你的查询语句,指定返回这个DTO:
@Query(value = "select new com.yourproject.dto.HourlyCountDTO(sum(PC.count), hour(PC.time)) from ProductCount as PC where PC.time >= :currentDate and PC.time < :nextDate group by hour(PC.time)") List<HourlyCountDTO> findByCountAndGroupByTime(@Param("currentDate") Timestamp currentDate, @Param("nextDate") Timestamp nextDate);
之后调用getFormattedHour()就能直接拿到格式化好的小时字符串了,代码结构更清晰。
内容的提问来源于stack exchange,提问作者nirvair
相关产品推荐
相关产品推荐

