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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:15:59