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

如何让JPA分页按日期排序时返回Date而非时间戳?

解决JPA分页查询时Date字段序列化不一致的问题

我之前维护遗留项目时也碰到过几乎一模一样的问题——普通查询返回ISO格式的日期字符串,分页查询就变成了时间戳,给依赖方造成了不小的困扰。结合你的场景,给你几个快速见效的解决方案:

可能的原因

本质上是Spring Data JPA返回的Page对象和普通List<Entity>在序列化流程上有差异:普通列表查询的实体直接由Jackson序列化,而分页查询的Page是Spring封装的容器类,内部实体的序列化规则可能被全局配置或局部注解覆盖,导致Date字段处理不一致。

解决方案

1. 全局统一Jackson的Date序列化配置(推荐)

这是最省心的方案,不用修改任何业务代码,直接在项目的配置文件里添加Jackson的日期格式化配置:

如果是application.properties:

# 指定Date类型的序列化格式
spring.jackson.date-format=yyyy-MM-dd'T'HH:mm:ss.SSSXXX
# 对应示例中的UTC时区
spring.jackson.time-zone=UTC

如果是application.yml:

spring:
  jackson:
    date-format: yyyy-MM-dd'T'HH:mm:ss.SSSXXX
    time-zone: UTC

配置后,不管是分页还是不分页查询,所有Date类型字段都会统一序列化成你需要的2019-10-09T04:17:49.000+00:00格式。

2. 给实体字段添加局部序列化注解

如果不想全局修改所有Date字段的格式,只想针对createdAt字段单独配置,可以在实体类的字段上添加Jackson的@JsonFormat注解:

import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;

// ...其他实体代码
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
private Date createdAt;

这个注解会强制指定该字段的序列化规则,不受全局配置或查询方式的影响。

3. 排查分页后的结果处理逻辑

有时候问题出在分页查询后的自定义处理上——比如你可能在代码里把Page<Entity>转成了DTO,或者手动处理了createdAt字段,不小心把Date转成了时间戳。可以检查调用分页查询后的代码:

// 比如类似这样的转换逻辑要注意
Page<Entity> pageResult = repository.findAllByUserId(userId, pageRequest);
List<EntityDto> dtoList = pageResult.getContent().stream()
    .map(entity -> {
        EntityDto dto = new EntityDto();
        // 错误示例:把Date转成了时间戳
        // dto.setCreatedAt(entity.getCreatedAt().getTime());
        // 正确做法:保留Date类型,让Jackson自动序列化,或者手动格式化为字符串
        dto.setCreatedAt(entity.getCreatedAt());
        return dto;
    })
    .collect(Collectors.toList());

关于LocalDateTime的补充说明

你提到尝试改为LocalDateTime未成功,大概率是遗留项目的依赖版本(比如Spring Data JPA、Jackson、Hibernate)对java.time支持不完善,或者数据库字段类型(比如DATE/TIMESTAMP)和LocalDateTime的映射没配置对。如果当前业务压力大,可以先解决序列化问题,后续再逐步重构日期类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:27:37