Mybatis@Result使用报错:Mapped Statements collection does not contain value for XXX

21 篇文章 0 订阅
21 篇文章 0 订阅

一、报错信息


### Error querying database.  Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for xxx.AmsAlgorithmDao.queryAlgorithmById
### The error may exist in xxx/JmsJobDao.java (best guess)
### The error may involve xxx.JmsJobDao.queryWaitToExecute
### The error occurred while handling results
### SQL: select * from xxx where xxx=xxx
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for xxx.AmsAlgorithmDao.queryAlgorithmById

二、常见原因分析

1.mybatis的映射文件的命令空间与接口的全限定名不一致;

2有可能mybatis的映射文件名字与接口的类名字不一致;

3.还有一种情况就是接口声明的方法在映射文件里面没有。

以上内容来自参考文章[1],致使这部分出错的常见原因是因为书写出错导致异常,正常情况下不需要百度,自行检查代码编写即可解决

三、本次错误分析

1.背景

1)使用mbg自动生成mapper.xml与使用@select相关的注解一起使用

2)单个@select使用没有问题

3)@Result按常规使用报错

4)使用@MapperScan扫描mapper.xml与接口组件dao

2.原因

因为使用mbg自动生成并且使用混合方式,在@MapperScan扫描时,先扫描Mapper.xml导致@Result使用时会先使用默认的BaseResultMap找不到@Result定位的方法导致出错

具体问题知识应见Mybatis的命名空间的使用以及定位知识

相似问题参考文章[2]

3.解决方法

在@MapperScan扫描时先扫描组件dao所在的包再扫描mapper.xml的相关目录即可

4.其他异常

使用@one时在InitializingBean接口方法中使用时会出错(Mybatis的动态注解SQL注入问题),在引用到该Dao的类中将相关的关联的Dao一起注入就能解决问题

举例:JobDao:

@Select("select * from jms_job where status=2)
    @Results(id="algorithmOnly",value = {
            @Result(property="algorithm",
                    column = "aid",
                    one = @One(select = "edu.zrq.dao.AmsAlgorithmDao.queryAlgorithmById", fetchType = FetchType.EAGER)
            )
    })
    List<Job> queryWaitToExecute();

在继承InitializingBean的类中需要同时注入AmsAlgorithmDao与JobDao,因为在Spring中类的实例化是懒加载形式的,在InitializingBean阶段并没有生成无关的类并保存到Bean容器中

四、参考文章

[1] Mapped Statements collection does not contain value for 解决方法

https://blog.csdn.net/weimezilie/article/details/51940546

[2] Mybatis绑定多个mapper,@ResultMap 报错

https://www.jianshu.com/p/c5785aa3f516

[3] @Result等注解标签使用方式

https://mybatis.org/mybatis-3/zh/java-api.html#sqlSessions

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值