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

JPA调用findAll()查询含java.sql.Date字段的表时出现报错

问题解决方案

核心问题定位

该问题属于JPA与MariaDB的date类型映射不匹配,单条/条件查询返回结果量小,未触发批量类型转换逻辑所以运行正常,findAll()返回全量数据时触发类型转换异常。直接执行SQL正常说明数据库存储无问题,问题集中在JPA实体字段映射规则和序列化环节。

修复方案

按优先级依次尝试以下方案,所有方案都需要先删除national_day字段上的@Transient注解:

  • 方案1:修正日期字段的JPA映射规则
    优先使用JDK8+提供的java.time.LocalDate作为字段类型,搭配@Temporal注解明确指定日期类型:
    import java.time.LocalDate;
    import jakarta.persistence.Column;
    import jakarta.persistence.Temporal;
    import jakarta.persistence.TemporalType;
    
    // 实体类字段定义
    @Column(name = "national_day")
    @Temporal(TemporalType.DATE)
    private LocalDate nationalDay;
    
    如果使用的是JDK8之前的旧项目,可将字段类型替换为java.util.Date,注解配置保持一致。
  • 方案2:适配MariaDB方言
    在项目配置文件中明确指定MariaDB方言,避免Hibernate自动识别时误用MySQL的旧日期转换规则:
    # application.properties 配置
    spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect
    spring.jpa.properties.hibernate.jdbc.time_zone=Asia/Shanghai
    
  • 方案3:强制指定字段数据库类型
    若映射仍不匹配,直接通过columnDefinition属性明确指定对应数据库字段类型:
    @Column(name = "national_day", columnDefinition = "DATE")
    private LocalDate nationalDay;
    
  • 方案4:修复序列化异常
    若排查报错栈发现是Jackson序列化日期时抛出异常,添加序列化注解指定日期格式即可:
    import com.fasterxml.jackson.annotation.JsonFormat;
    
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate nationalDay;
    

额外排查点

检查项目是否修改了JPA默认命名策略,确保驼峰与下划线映射正常:

spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:39:03