SQLite数据库LocalDate格式返回异常问题求助
解决SQLite中LocalDate返回时间戳而非日期字符串的问题
问题根源在于SQLite没有原生的DATE数据类型,默认会将日期类字段存储为数值型时间戳;而H2数据库对日期类型的处理更贴近标准SQL,因此出现差异。以下是几种可行的解决方法:
方法一:指定实体类字段的存储类型为TEXT
修改Log实体类的dateLogged字段,通过columnDefinition强制SQLite以文本格式存储日期字符串:
@Column(nullable = false, columnDefinition = "TEXT") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private LocalDate dateLogged;
这样SQLite会直接存储yyyy-MM-dd格式的字符串,读取时JPA能正确映射为LocalDate,返回前端时@JsonFormat也能正常序列化为指定格式的字符串。
方法二:配置SQLite JDBC驱动的日期处理参数
在数据库连接URL中添加date_string_format参数,让JDBC驱动以指定格式返回日期字段:
# application.properties spring.datasource.url=jdbc:sqlite:your-database-name.db?date_string_format=yyyy-MM-dd
这个参数会让SQLite驱动将日期类型的数值自动转换为指定格式的字符串,无需修改实体类代码。
方法三:全局配置Jackson的LocalDate序列化规则
如果上述方法无效,可能是全局序列化配置覆盖了字段上的@JsonFormat,可以添加Jackson配置类统一处理LocalDate的序列化:
@Configuration public class JacksonDateConfig { @Bean public ObjectMapper customObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); JavaTimeModule timeModule = new JavaTimeModule(); // 序列化LocalDate为yyyy-MM-dd格式字符串 timeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); // 反序列化字符串为LocalDate timeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); objectMapper.registerModule(timeModule); return objectMapper; } }
注意:如果使用方法一,需要重新生成数据库表(或手动修改现有表的字段类型),否则原有的时间戳数据可能无法正常转换。
内容的提问来源于stack exchange,提问作者Haerin
相关产品推荐
相关产品推荐

