今天在搞mybatis,完成Mappper方法:
@Select("select * from emp where name like '%${name}%'and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc")
public List<Emp> getList(String name, short gender, LocalDate begin, LocalDate end);
测试报错:发现idea没按照默认顺序进行参数匹配。
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'name' not found. Available parameters are [arg3, arg2, arg1, arg0, param3, param4, param1, param2]
查看编译后Mapper方法:编译并未保留方法的形参名称,故无法实现匹配。
@Select({"select * from emp where name like '%${name}%'and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc"})
List<Emp> getList(String val1, short val2, LocalDate val3, LocalDate val4);
查看自己的spring版本:
<properties>
<java.version>11</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.7.6</spring-boot.version>
</properties>
2.x以上,版本没毛病,那估计是idea的问题。
遂参考大佬文章:
jdk1.8 开启-parameters参数,编译保留参数名,为反射提供便利-CSDN博客
在Additional command line parameters选项中添加
-parameters
然后Rebuild Project(注意不能只Rerun方法!!!!)
成功!
ps:破抽象问题搞了好久,结果一直没找南感觉自己小命不保,溜了
12.26更新,今天又碰到这种问题了,试了上述办法都不好使,甚至加了@Param,也不管用。
最终解决:查看编译的文件,为了运行就设置sql的变量为args0,args1...,然后rebuild,测试成功。
然后再改回来。。。。。
再rebuild,没毛病了就。