Parameter 'lId' not found. Available parameters are [merchantQuery, param1]

/ MybatisMarkbug / 没有评论 / 289浏览

今天在公司开发项目时遇到了下面的错误:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.binding.BindingException: Parameter 'lId' not found. Available parameters are [merchantQuery, param1]

因为有个别的需求,需要在新增后返回新增记录的自增主键ID,因为之前做项目时遇到过同样的需求,于是二话不说,直接使用了下面的Mybatis配置返回主键(当然也可以使用其它的方式):

<insert id="copyProcToMasterById" keyProperty="lId" useGeneratedKeys="true"  parameterType="com.xl.merchant.appshow.query.MerchantQuery">

但在执行时抛出了上面的异常提示lId找不到,因为上述的配置,Mybatis会自动调用set方法将添加后的主键设置到parameterType指定的类型中,所以当提示找不到lId时,本人特意查了一下MerchantQuery类,发现确实有lId属性,并且已经添加了set方法.那到底是什么原因导致的上述问题呢?答案就是别名.也就是和当前Mybatis方法对应的接口中参数的别名,也就是@Param注解导致的.我们知道在Java中反射时是获取不到方法的参数名的,于是Mybatis采用注解的方式解决获取不到接口中定义的参数名,也就相当于别名.所以在我们使用这个类里面的字段时都必须添加别名,否则会导致我们到不到类中的属性,也就是异常中的错误.所以解决上述问题,就变的比较简单了,只要将keyProperty中的lId修改为@Param注解中别名.lId问题迎刃而解。