JPA调用findAll()查询含java.sql.Date字段的表时出现报错
问题解决方案
核心问题定位
该问题属于JPA与MariaDB的date类型映射不匹配,单条/条件查询返回结果量小,未触发批量类型转换逻辑所以运行正常,findAll()返回全量数据时触发类型转换异常。直接执行SQL正常说明数据库存储无问题,问题集中在JPA实体字段映射规则和序列化环节。
修复方案
按优先级依次尝试以下方案,所有方案都需要先删除national_day字段上的@Transient注解:
- 方案1:修正日期字段的JPA映射规则
优先使用JDK8+提供的java.time.LocalDate作为字段类型,搭配@Temporal注解明确指定日期类型:
如果使用的是JDK8之前的旧项目,可将字段类型替换为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;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
相关产品推荐
相关产品推荐

