首页 > 数据库 >MyBatis+Sharding-JDBC实体类LocalDateTime类型字段查询报SQLFeatureNotSupportedException: getObject with type

MyBatis+Sharding-JDBC实体类LocalDateTime类型字段查询报SQLFeatureNotSupportedException: getObject with type

时间:2023-05-31 22:44:05浏览次数:50  
标签:实体类 return columnValue getObject LocalDateTime java type public

问题

最近协助渠道组开发新需求,封装实现了一个公共模块供不同渠道项目使用。
以前各个渠道项目有很多相似的菜单和功能,各自项目里自己的代码实现,本公共模块对新需求的功能点进行抽象,减少重复代码,提高模块复用性和可维护性。
目前有2个渠道项目接入了该公共模块,自测时发现其中1个运行正常,另1个项目运行报错,日志如下:

Error attempting to get column ‘create_time’ from result set.
...
at com.xxx.xxx(XxxServiceImpl.java:76)
Caused by: java.sql.SQLFeatureNotSupportedException: getObject with type
	at org.apache.shardingsphere.shardingjdbc.jdbc.unsupported.AbstractUnsupportedOperationResultSet.getObject(AbstractUnsupportedOperationResultSet.java:221)
	at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:38)
	at org.apache.ibatis.type.LocalDateTimeTypeHandler.getNullableResult(LocalDateTimeTypeHandler.java:28)
	at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:81)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyAutomaticMappings(DefaultResultSetHandler.java:521)

注意到日志里的shardingjdbc,该渠道项目使用了shardingjdbc进行分表。

在公共模块里使用了MyBatis,公共的实体类中定义了LocalDateTime类型字段:

@TableField(value = "create_time", insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private LocalDateTime createTime;

@TableField(value = "update_time" insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private LocalDateTime updateTime;

本地启动项目调试,在LocalDateTimeTypeHandler类的38行rs.getObject(columnName, LocalDateTime.class)打上断点:

public class LocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> {
  ...
  @Override
  public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
    return rs.getObject(columnName, LocalDateTime.class);
  }
}

进到了AbstractUnsupportedOperationResultSet类,抛出了SQLFeatureNotSupportedException异常。

  • mybatis-plus-boot-starter版本:3.1.2
  • sharding-jdbc-core版本:4.1.1
    查询资料发现2者有冲突。

解决

通过自定义类扩展TypeHandler来处理LocalDateTime类型字段。

/**
 * @author cdfive
 */
@MappedTypes(LocalDateTime.class)
@MappedJdbcTypes(value = JdbcType.TIMESTAMP, includeNullJdbcType = true)
public class CustomLocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> {

    private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType)
            throws SQLException {
        if (parameter != null) {
            ps.setString(i, dateTimeFormatter.format(parameter));
        }
    }

    @Override
    public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String columnValue = rs.getString(columnName);
        if (StringUtils.isEmpty(columnValue)) {
            return null;
        }
        return LocalDateTime.parse(columnValue, dateTimeFormatter);
    }

    @Override
    public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String columnValue = rs.getString(columnIndex);
        if (StringUtils.isEmpty(columnValue)) {
            return null;
        }
        return LocalDateTime.parse(columnValue, dateTimeFormatter);
    }

    @Override
    public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String columnValue = cs.getString(columnIndex);
        if (StringUtils.isEmpty(columnValue)) {
            return null;
        }
        return LocalDateTime.parse(columnValue, dateTimeFormatter);
    }
}

通过DateTimeFormatter进行格式转换。

在项目的yml配置文件里指定类型处理类的包路径:

mybatis-plus:
  type-handlers-package: com.xxx.mybatis.typehandler

参考

标签:实体类,return,columnValue,getObject,LocalDateTime,java,type,public
From: https://www.cnblogs.com/cdfive2018/p/17445934.html

相关文章

  • JDK 8 新时间LocalDate、LocalTime、LocalDateTime
            ......
  • mybatis查询时实体类属性名与表的字段名不一致的解决方法
    目录1、设置查询字段别名法2、在mybatis的核心配置文件中设置全局配置信息mapUnderscoreToCamelCase为true,将表中字段的下划线自动转换为驼峰3、将select语句的resultType换为resultMap,在resultMap中配置字段名和属性值的对应关系———————————————— 问题描......
  • java XML字符串和bean实体类互转
    pom引入依赖<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.13.1</version></dependency>实体类p......
  • MybatisPlusGenerator 实体类 xml dao 生成工具
    packagecom.thtf.zwdsj.gongjia.config;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.baomidou.mybatisplus.generator.FastAutoGenerator;importcom.baomidou.mybatisplus.generator.config.OutputFile;importcom.baomidou.mybatisplus.gener......
  • SqlSever表结构转C#实体类
    declare@TableNamesysname='repair_plan'declare@Resultvarchar(max)='///<summary>///'+@TableName+'///</summary>publicclass'+@TableName+'{'select@Result=@Result+'///......
  • 实体类
        ......
  • 实体类
        ......
  • java 给实体类赋默认值通用方法
    importjava.lang.reflect.Field;importjava.lang.reflect.Modifier;importjava.math.BigDecimal;importjava.sql.Date;importjava.sql.Timestamp;importjava.util.ArrayList;importjava.util.List;/***使用反射给实体类k赋值(默认值)*insertupdate会报null......
  • OpenAPI document 生成实体类
    根据 OpenAPIdocument 生成.net类包括Controllerclass Entityclass 支持输入yaml/json工具下载地址:NSwagStudio.msihttps://github.com/RicoSuter/NSwag/releases......
  • springboot+mybatis逆向生成xxxmapper+xxxmapper.xml和xxx实体类
    1.新建springboot工程pom文件如下<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="ht......