【报错记录】MybatisPlus报Mapped Statements collection does not contain value for...
前言
为了让我的SqlUtil用起来更香,我准备将SqlHelper中的saveOrUpdateBatch方法的参数从Class<?> mapper换成mapper的实体类,再通过mapper.getClass()的方式获取其真实类。
报错信息
如果是批量插入会报:
Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.sun.proxy.$Proxy129.insert
如果是执行批量更新则会报:
Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.sun.proxy.$Proxy129.updateById
代码如下:
public static <T extends BaseEntity, R extends BaseMapper<T>> void saveBatch(Class<R> mapperClass, List<T> entityList, Long userId) {saveBatch(mapperClass, entityList, userId, 10000);}public static <T extends BaseEntity, R extends BaseMapper<T>> void saveBatch(R mapper, List<T> entityList, Long userId) {saveBatch(mapper.getClass(), entityList, userId, 10000);}public static <T extends BaseEntity, R extends BaseMapper<T>> void saveBatch(Class<R> mapperClass, List<T> entityList, Long userId, int batchSize) {if (entityList.size() == 0) {return;}T t = entityList.get(0);Class<T> entityClass = (Class<T>) t.getClass();SqlHelper.saveOrUpdateBatch(entityClass, mapperClass, log, entityList, batchSize, (sqlSession, entity) -> {// INFO: DCTANT: 2021/12/27 insert判断,返回true则是走insert代码,返回false则会走后面的update代码if (entity == null) {return false;}Long id = entity.getId();if (id == null) {// INFO: DCTANT: 2021/12/27 insert前加一些自己必要的业务逻辑,如setCreateTime、setDel、setVersion等等insertNecessaryField(entity, userId);return true;} else {// INFO: DCTANT: 2021/12/27 去执行update的代码return false;}}, (sqlSession, entity) -> {// INFO: DCTANT: 2021/12/27 判断为update,然后执行必要操作 if (entity == null) {return;}// INFO: DCTANT: 2021/12/27 update前加一些自己的业务逻辑,如setUpdateTime等等updateNecessaryField(entity, userId);MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();// INFO: DCTANT: 2022/8/22 参数需要为Constants.ENTITY,也就是里面的et,否则会报et这个参数无法找到param.put(Constants.ENTITY, entity);String sqlStatement = SqlHelper.getSqlStatement(mapperClass, SqlMethod.UPDATE_BY_ID);sqlSession.update(sqlStatement, param);});}
这个问题一开始报的让人摸不着头脑,若不是开了上帝视角,从前言中已经知道大概的问题原由,真是让人一头雾水,proxy类是哪来的,insert和updateById方法这两个方法在mapper中本来就有,凭什么会找不到!
这里一共三种写法,其中2、3是等价的
第一种写法打断点可得知拿到的就是Mapper它自己本身的类
这种写法能够反射获取其中的insert和updateById方法。
而第二、三种方法打断点获得的类是
实际是Java的代理类,Proxy类,这里面哪会存在insert和updateById方法,这就是报错的原因。所以方法不能胡乱抽取,这种就属于得不偿失,且无解。只能将本身的Class传入才能不报错,删除刚才的saveBatch(Class<R> mapperClass, List<T> entityList, Long userId)这个方法即可。
如果大家有什么其他解法可以指出,本人虚心接受。
【报错记录】MybatisPlus报Mapped Statements collection does not contain value for...相关推荐
- mybatis报错:java.lang.IllegalArgumentException: Mapped Statements collection does not contain
在做mybatis案例的时候发现了一个问题,报错如下: org.apache.ibatis.exceptions.PersistenceException: ### Error querying da ...
- 解决Spring Boot报错Mapped Statements collection already contains value for...Error while adding the mapp
解决Spring Boot报错Mapped Statements collection already contains value for...Error while adding the mapp ...
- 记录Mybatis报Mapped Statements collection already contains value for 的错误的原因
在一次提供升级包让同事升级后,启动服务时出现Mybatis报Mapped Statements collection already contains value for 的错误,导致无法启动. 1. ...
- oracle 被另一用户锁定,Oracle报错记录被另外一个用户锁定的解决方案
原因 当一个用户对数据进行修改时,若没有进行提交或者回滚,Oracle不允许其他用户修改该条数据,在这种情况下修改,就会出现:"记录被另外一个用户锁定"错误. 解决 查询用户.数据 ...
- php curl 不验证ssl,PHP Curl https跳过ssl证书认证报错记录及解决
PHP Curl https跳过ssl证书认证报错记录及解决 function get($url = '', $cookie = '') { $ch = curl_init(); curl_setop ...
- ROS安装与报错记录
ubuntu18.04 安装ros-melodic的踩最全的坑的记录 目录 ubuntu18.04 安装ros-melodic的踩最全的坑的记录 ubuntu 18.04 ros-melodic 安装 ...
- 我的ssis和ssas报错记录
我的ssis和ssas报错记录 我的数据库装的是SQL Server 2005标准版本的,在这个版本里不具有数据透视功能, 所以解决这个的办法,只有把安装更高级的版本了,有 开发版和企业版,企业版要求 ...
- mongodb报错:Problem inserting to mongo collection: no reachable servers
文章目录 mongodb报错:Problem inserting to mongo collection: no reachable servers mongodb报错:Problem inserti ...
- npm install安装失败,报错记录之The operation was rejected by your operating system. node-sass无法安装,且禁用淘宝镜像
因为公司电脑都由管理员管控,使用自己的账号是无法执行一些需要管理员权限的命令,所以在刚到公司时,使用管理员账号安装了node,配置了node缓存目录node_cache.node_global,以及设 ...
- Errors报错记录
Errors报错记录 前言 Error1 Error2 Error3 Error4 Error5 Error6 Error7 Error8 Error9 Error10 Error11 总结 前言 记 ...
最新文章
- Node.js 将Json文件数据转为SQL可执行的insert语句
- 阿里产品专家:高情商的技术人,如何做沟通?
- 【Python基础】Jupyter Notebook最常用的五大配置技巧
- [HDU3336]Count the string(KMP+DP)
- 公用机房计算机主板选购,才知道,IDC机房运维工作居然可以如此简单!
- python之socket编程
- sql 时间 没有日期_SQL-补充:日期和时间戳互转
- 得物:两款问题商品系标识标注方式不符合最新规定 已先行下架商品
- to_csvread_csvisnullisnanisna
- nginx rewrite php参数,Nginx泛域名解析及Rewrite重定向普通页面及带参数的页面
- mysql数据库url正确的是_下面关于连接mysql下的mydb数据库的url,编写正确的是()...
- 芒格推荐书单(完全版32本)
- Python 微信自动化工具开发系列06_根据用户信息自动回复升级版本(2022年10月可用)
- calloc()函数
- 第一周学习前端html的知识总结与感悟
- Node.js中的npm与包
- 线性回归2020年天猫双十一销量
- 单片机(MCU)复位电路
- 面试常问的PECS原则,到底是什么鬼?
- 20175208 实验一 Java开发环境的熟悉