前言
springboot项目,使用的是mybatisplus框架。
现象
我再使用mappr执行方法updateById时,出现了以下错误
nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='et.props', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.postgresql.util.PSQLException: No hstore extension installed.
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='et.props', mode=IN, javaType=class java.lang.Object, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #4 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.postgresql.util.PSQLException: No hstore extension installed.
问题定位
通过异常的字面意思我们可以理解为是mybatis类型错误。
通过DEBUG进行跟进我们发现在给其中一个字段设置TypeHandler时出现了异常情况,说明这里没有能够识别该字段的类型。
原因分析
我们现在实体类中查看一下该字段的类型,发现是一个Map类型的
在数据库中查看该字段设置的类型 ,可以看到数据库中存储的是JSON类型
解决方案
给实体类设置TypeHandler与jdbcType
@TableField(el = "props,jdbcType=OTHER,typeHandler=com.embracesource.cloud.fsgw.entity.HashMapJsonTypeHandler")
private Map<String, Object> props;
HashMapJsonTypeHandler类
import com.alibaba.fastjson.JSON;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.postgresql.util.PGobject;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class HashMapJsonTypeHandler extends BaseTypeHandler<Map<String,Object>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Map<String,Object> parameter,
JdbcType jdbcType) throws SQLException {
PGobject jsonObject = new PGobject();
jsonObject.setType("json");
jsonObject.setValue(JSON.toJSONString(parameter));
ps.setObject(i, jsonObject);
}
@Override
public Map<String,Object> getNullableResult(ResultSet rs, String columnName)
throws SQLException {
return JSON.parseObject(rs.getString(columnName), HashMap.class);
}
@Override
public Map<String,Object> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return JSON.parseObject(rs.getString(columnIndex), HashMap.class);
}
@Override
public Map<String,Object> getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
return JSON.parseObject(cs.getString(columnIndex), HashMap.class);
}
}
再次启动项目发现问题解决