一、背景描述
项目说明:Spring boot (v2.0.0 RELEASE) + Mybatis-Plus (v3.1.1 RELEASE)
最近在项目中调试接口的时候遇到这样一个问题,mybatis解析时出错:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'deptId' in 'class java.lang.String',如下图所示:
二、错误原因
正常情况下,我们都知道mybatis在进行参数判断的时候,直接可以用 就可以了,使用entity实体或者Map的时候,下面的代码是正确的:
下面是重点哦:
但是单个参数和多参数的判断有个不同点,当我们的入参为entity实体,或者map的时候,使用 if 参数判断没任何问题。但是当我们的入参为java.lang.Integer 或者 java.lang.String的时候,这时候就需要注意一些事情了。
我们需要使用 if 参数判断 引入参数,会抛异常nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'deptId' in 'class java.lang.String'
<select id="queryList" resultType="com.soft.back.model.OutdevFactory" parameterType="java.lang.String"> select <include refid="Base_Column_List"/> from op_outdev_factory <where> <if test="factoryName != null"> and name like concat('%',#{factoryName},'%') </if> </where> </select>
至于原因嘛就是对于这类单个入参然后用 if 判断的,mybatis有自己的内置对象,Mybatis默认采用OGNL解析参数,所以会自动采用对象树的形式取 string.xxx 值,如果没在在方法中定义,则会抛异常报错。
三、解决方案
方案一:把 #{xxx} 修改为 #{_parameter}
<select id="queryList" resultType="com.soft.back.model.OutdevFactory" parameterType="java.lang.String"> select <include refid="Base_Column_List"/> from op_outdev_factory <where> <if test="_parameter != null"> and name like concat('%',#{_parameter},'%') </if> </where> </select>
方案二:在方法中提前定义
/** * 查询厂家列表 * @param factoryName * @return */ List<OutdevFactory> getFactoryList(@Param("factoryName") String factoryName);
<select id="queryList" resultType="com.soft.back.model.OutdevFactory" parameterType="java.lang.String"> select <include refid="Base_Column_List"/> from op_outdev_factory <where> <if test="factoryName!= null"> and name like concat('%',#{factoryName},'%') </if> </where> </select>
注意事项:其他mybatis的版本不知道有没有这个问题,暂时不知道。
完结!