当前使用版本(必须填写清楚,否则不予处理)
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
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;