pg数据库适配问题
场景:多数据库适配,在mysql数据库中执行没有问题的sql,在适配Postgresql时查询报错
详细描述:mapper中sql出错位置report_date between #{startDate} and #{endDate}
,dao中入参类型为LocalDateTime
,mysql中字段类型为datetime
报错信息:
操作符不存在: timestamp without time zone <= character varying
Hint: 没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换
解决方案:
采用的第一个方案是将dao中的入参类型改为Timestamp
,能解决Postgresql问题,但在mysql数据库中查不到数据,因为mysql的Timestamp
和datetime
类型不对应。于是换种方案将dao中的入参类型改为LocalDate
,可兼容mysql和Postgresql。
ps:values(#{startDate,jdbcType=DATE})
可将Java类型转为mysql类型,但未经实践检验。
分析:Postgresql数据库不能对字符串类型进行大于小于等比较操作,当时间类型数据格式不符合规范时,sql中的between、gt、lt等操作会报错。Postgresql的时间类型格式为2023-01-01 10:00:00+08(带时区)
、2023-01-01 10:00:00(不带时区)
。java中用LocalDateTime
取的时间格式是2023-01-01T00:00
。