背景
数据库用的是PG,且created_time字段用的是带时区的timestamptz类型:
用MyabtisPlus(MP)的的代码生成,默认生成的是JDK8的LocalDateTime类型:
结果,在查询时候,无法做到实体类的类型自动转换,如果是Date类型,则是没有问题的。
注:MP版本为3.5.x,PG JDBC版本为42.3.8
解决方案1
将数据库字段类型改为timestamp类型。
因为通过分析源码,发现PG的JDBC包中只支持timestamp类型转换为LocalDateTime,而不支持timestamptz类型的转换(即便最新版42.7.5),所以才报错,见源码PgResultSet.getLocalDateTime:
如果实体类中字段类型是Date或Timestamp类型,则是兼容支持两种类型的:
解决方案2
实现自定义的CustomLocalDateTimeTypeHandler,使其兼容支持,默认的类型转换类,比较简单:
由此可以看出,实现基本依赖各个数据库自身的JDBC库来转换映射。
而自定义转换器,则借助于Timestamp类:
使用方式,就是在字段的注解@TableField,指定该转换器,比如:
并且必须在实体类的@TableName注解上添加 autoResultMap = true,否则自定义转换器不会生效。