当前使用版本(必须填写清楚,否则不予处理)

plus3.1.2 postgresql11

该问题是怎么引起的?(最新版上已修复的会直接close掉)

以下为泛型typeHandler

public class JsonTypeHandler<T> extends BaseTypeHandler<T> {

    private Class<T> type;

    public JsonTypeHandler(Class<T> type) {
        if (type == null) {
            throw new IllegalArgumentException("Type argument cannot be null");
        }
        System.out.println("我被构造了,类型" + type);
        this.type = type;
    }


    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, JSON.toJSONString(parameter));
    }

    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String value = rs.getString(columnName);
        if (value != null)
            return JSON.parseObject(value, type);
        return null;
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String value = rs.getString(columnIndex);
        if (value != null)
            return JSON.parseObject(value, type);
        return null;
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String value = cs.getString(columnIndex);
        if (value != null)
            return JSON.parseObject(value, type);
        return null;
    }

}

重现步骤

例子项目 https://github.com/holy-sword/mybatis-plus-issues.git

直接运行 ServiceApplicationTests中的测试可观看结果,最后一个为使用xml文件查询的正确结果

数据库表在 db文件夹下

报错信息

Incompatible types. Found: 'java.lang.Class', required: 'java.lang.Class<? extends org.apache.ibatis.type.TypeHandler<?>>'

Comment From: miemieYaho

TableField 的 typeHandler 不能作用于 select 查询(等于你xml里写的 #{property,typehandler=xxx.xxx}),要select生效,要么打开tableName的autoResultMap,要么自己写resultmap再指定,

Comment From: holy-sword

@miemieYaho 感谢你的回复,现在我在例子项目中打开了tableName的autoResultMap=true 时,spring构建bean过程中就出错了,是还需要有哪些设置吗。 另外@TableField(typeHandler = JsonTypeHandler.class) 时会报类型错误 Incompatible types. Found: 'java.lang.Class<com.lzx.dao.core.type.JsonTypeHandler>', required: 'java.lang.Class>' ,现在只能使用el属性指定

Comment From: miemieYaho

typeHandler 就是 el的拆解,debug看com.baomidou.mybatisplus.core.injector.methods.Insert

Comment From: miemieYaho

Incompatible types. Found: 'java.lang.Class<com.lzx.dao.core.type.JsonTypeHandler>', required: 'java.lang.Class>' 这是无法编译啊.

Comment From: holy-sword

@miemieYaho 是的,使用泛型写的typeHandler @TableField(typeHandler = JsonTypeHandler.class) 都无法经过编译,将@TableField 注解中的 typeHandler 泛型擦除可以兼容,不过不是很优雅

Comment From: miemieYaho

下个版本修复,TableField 新增一个新的属性(String类型)设置 typehandler

Comment From: miemieYaho

新属性不要了,还是将@TableField 注解中的 typeHandler 泛型擦除好了, Class<? extends TypeHandler<?>> --> Class<? extends TypeHandler>

Comment From: holy-sword

@miemieYaho 现在当使用autoResultMap的时候,启动时找不到typeHandler,typeHandler已经在el属性中指定

Caused by: java.lang.IllegalStateException: No typehandler found for property d
    at org.apache.ibatis.mapping.ResultMapping$Builder.validate(ResultMapping.java:151)
    at org.apache.ibatis.mapping.ResultMapping$Builder.build(ResultMapping.java:140)
    at com.baomidou.mybatisplus.core.metadata.TableFieldInfo.getResultMapping(TableFieldInfo.java:537)
    at com.baomidou.mybatisplus.core.metadata.TableInfo.lambda$initResultMapIfNeed$6(TableInfo.java:358)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080)
    at com.baomidou.mybatisplus.core.metadata.TableInfo.initResultMapIfNeed(TableInfo.java:358)
    at com.baomidou.mybatisplus.core.metadata.TableInfoHelper.initTableInfo(TableInfoHelper.java:150)
    at com.baomidou.mybatisplus.core.injector.AbstractSqlInjector.inspectInject(AbstractSqlInjector.java:53)
    at com.baomidou.mybatisplus.core.MybatisMapperAnnotationBuilder.parse(MybatisMapperAnnotationBuilder.java:122)
    at com.baomidou.mybatisplus.core.MybatisMapperRegistry.addMapper(MybatisMapperRegistry.java:82)
    at com.baomidou.mybatisplus.core.MybatisConfiguration.addMapper(MybatisConfiguration.java:104)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.bindMapperForNamespace(XMLMapperBuilder.java:441)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.parse(XMLMapperBuilder.java:96)
    at com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean.buildSqlSessionFactory(MybatisSqlSessionFactoryBean.java:592)
    ... 67 more

相关代码更新在上面的例子项目中

Comment From: miemieYaho

autoResultMap 不支持 el

Comment From: miemieYaho

你可以试试 3.2.0.1-SNAPSHOT

Comment From: holy-sword

@miemieYaho 快照仓库地址是什么,另外建议下个版本直接去掉el属性而不是继续标记 @Deprecated 强制升级用户升级,因为实际行为与拆分出来的2个属性不一致容易引起困扰,最后个疑惑是autoResultMap 属性默认是关闭的,开启会带来的副作用是什么

Comment From: miemieYaho

文档有快照地址,el已删了,没什么副作用,不用自定义typehandler没必要打开,之前瞄到哪说什么resultmap比resulttype慢一丢丢.

Comment From: holy-sword

使用没问题了,等新版发布了

Comment From: qmdx

up 下一个版本 3.2.0

Comment From: mxpup

@tablefiled 去除el 属性,怎么实现外键字段

    /**
     * 外键:单位
     */
    @TableField(value = "unit_id")
    private TestUnit fkByUnitId;