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

一、报错信息


### 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 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

你可能感兴趣的:(Java编程,Javaweb,框架)