mybatis-plus icon indicating copy to clipboard operation
mybatis-plus copied to clipboard

批量插入时报错类型转换异常

Open tangjian335 opened this issue 3 years ago • 6 comments

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

3.3.2及以上

该问题是如何引起的?(确定最新版也有问题再提!!!)

项目原来只使用了mybatis,后面为了简化开发引入了mybatis plus,在执行一个批量插入的方法时,报错类型转换错误。经排查,在 com.baomidou.mybatisplus.core.MybatisDefaultParameterHandler#getParameters方法里面,因为参数的名字是list,但实际传入的是一个非list的Collection,导致强转时出现异常。

重现步骤(如果有就写完整)

批量插入或者批量更新时,参数定义为@Param("list") Collection list,在执行的时候报类型转换错误

报错信息

Caused by: java.lang.ClassCastException: java.util.HashMap$Values cannot be cast to java.util.List at com.baomidou.mybatisplus.core.MybatisDefaultParameterHandler.getParameters(MybatisDefaultParameterHandler.java:140) at com.baomidou.mybatisplus.core.MybatisDefaultParameterHandler.processParameter(MybatisDefaultParameterHandler.java:79) at com.baomidou.mybatisplus.core.MybatisDefaultParameterHandler.(MybatisDefaultParameterHandler.java:55) at com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver.createParameterHandler(MybatisXMLLanguageDriver.java:34) at com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver.createParameterHandler(MybatisXMLLanguageDriver.java:28) at org.apache.ibatis.session.Configuration.newParameterHandler(Configuration.java:579) at org.apache.ibatis.executor.statement.BaseStatementHandler.(BaseStatementHandler.java:69) at org.apache.ibatis.executor.statement.PreparedStatementHandler.(PreparedStatementHandler.java:41) at org.apache.ibatis.executor.statement.RoutingStatementHandler.(RoutingStatementHandler.java:46) at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:592) at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.doUpdate(MybatisSimpleExecutor.java:52) at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) at com.baomidou.mybatisplus.core.executor.MybatisCachingExecutor.update(MybatisCachingExecutor.java:83)

tangjian335 avatar Jan 06 '22 10:01 tangjian335

@tangjian335 您好,方便提过一下完整的demo,或者贴一下关键的使用截图吗

mabyoung avatar Jan 11 '22 12:01 mabyoung

@mabyoung 我写了个demo,其中User不是mybatis plus管理的类; image image

tangjian335 avatar Jan 12 '22 07:01 tangjian335

您可以改成这样试试: int batchInsert(@Param("list") List<User> list); insert into user(id, name, gender, role_name) VALUES (#{item.id},#{item.name},#{item.gender},#{item.roleName})

mabyoung avatar Jan 18 '22 07:01 mabyoung

我知道怎么改是正确的,我只是觉得MybatisDefaultParameterHandler里面对参数的处理逻辑可以优化一下。我知道getParameter的本意是把mybatis放到map里面的集合参数给取出来,但是有可能map里面的参数不是wrappedCollection方法放进去的

tangjian335 avatar Jan 18 '22 07:01 tangjian335

image

com.baomidou.mybatisplus.core.MybatisParameterHandler#getParameters 方法,第 194 行,改为强转为 Collection,是不是就可以了?我看方法的返回值类型也是 Collection。

Sdky avatar Mar 22 '22 02:03 Sdky

既然@Param命名都叫list了,尽量还是传入list为好

VampireAchao avatar Apr 20 '22 14:04 VampireAchao