### 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)使用mbg自动生成mapper.xml与使用@select相关的注解一起使用
2)单个@select使用没有问题
3)@Result按常规使用报错
4)使用@MapperScan扫描mapper.xml与接口组件dao
因为使用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