基础环境
- RuoYi v3.8.8(SpringBoot+Vue前后端分离)
- druid-spring-boot-starter 1.2.23
- mybatis 3.5.13
- mybatis-plus-boot-starter 3.5.1
- sharding-jdbc-core 4.1.1
问题描述
有关问题描述、排查过程、问题原因请移步(注:解决方案没有使用该链接中的,如果你使用连接中的解决方案生效的话,也可以,建议都试试):
Cause: java.sql.SQLFeatureNotSupportedException: getObject with type
解决方案
我使用的解决方案是参考的这篇文章:
shardingJdbc的LocalDateTime问题
但是使用这篇文章中的解决方案并没有完全解决我的问题,重写LocalDateTimeTypeHandler类后再次执行查询操作发现仍然报错:
Caused by: java.lang.ClassCastException: java.time.LocalDateTime cannot be cast to java.sql.Timestamp
at org.apache.shardingsphere.shardingjdbc.jdbc.core.resultset.ShardingResultSet.getTimestamp(ShardingResultSet.java:251)
at org.apache.ibatis.type.DateTypeHandler.getNullableResult(DateTypeHandler.java:37)
at org.apache.ibatis.type.DateTypeHandler.getNullableResult(DateTypeHandler.java:28)
at org.apache.ibatis.type.BaseTypeHandler.getResult(BaseTypeHandler.java:86)
... 184 common frames omitted
以上报错是我在一堆报错日志中提取的最下边一段,你会发现,这一次的报错原因是这个
所以,到这里答案也就很简单了,再把DateTypeHandler类重写一下就是了,下面附上我自己重写的DateTypeHandler类(其实就是根据重写的LocalDateTimeTypeHandler类稍加改动来的)
import cn.hutool.core.convert.Convert;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.springframework.stereotype.Component;
import java.sql.*;
import java.util.Date;
/**
* 参考LocalDateTimeTypeHandler类写的
*
* @author xiaolong
*/
@Component
// 定义转换器支持的JAVA类型
@MappedTypes(Date.class)
// 定义转换器支持的数据库类型以及是否可以处理空值
@MappedJdbcTypes(value = JdbcType.DATE, includeNullJdbcType = true)
public class DateTypeHandler extends BaseTypeHandler<Date> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
ps.setObject(i, parameter);
}
@Override
public Date getNullableResult(ResultSet rs, String columnName) throws SQLException {
return Convert.toDate(rs.getObject(columnName));
}
@Override
public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return Convert.toDate(rs.getObject(columnIndex));
}
@Override
public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return Convert.toDate(cs.getObject(columnIndex));
}
}
好了,问题完美解决!各位同学有不懂的或者意见建议的,欢迎积极留言,如果我的文章为你解决了问题,还请不要吝啬你点赞的权力哦!!!