昨天运行公司项目的一个模块时,后台报了一个错:
Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'id' in 'class java.lang.String'
一看是某个属性没有get方法,可是再一看不对劲啊,java.lang.String,大概意思是String类中属性为id的getter,怎么id属性成String类中的了???
看下查询语句:
<select id="get" resultType="Target" >
SELECT
FROM sp_target a
<where>
<if test="id != null and id !=''">
and a.id = #{id}
</if>
</where>
</select>
SELECT 后面没有字段,我删除了,不影响我们讨论的问题。这个查询只传入了一个参数,是String类型的,并且where标签中增加了一个if test的判空,其实问题就是在这里,当我们传入一个String对象参数,Mybatis会把id当做String对象的一个属性,这很显然是有问题的,String不是我们定义的类。说白了,Mybatis认为id是String类的一个属性,但String中并没有id这个属性。
两种解决方法:
一、if test中的id用_parameter替换,而实际的语句不需要修改and a.id = #{id},因为Mybatis当只传入一个参数时#{ } 中的内容没有要求。
二、在Mapper中给出入参设置名称,例:public ... getById(@Param("id") String id);这样修改后我们前面的写法就不会报错了。
额外一种解决方法:
如果该字段必定不为空的话,可以不使用if标签,这样and a.id = #{id} 这样的写法也不会报错。
希望能帮助到大家,如有问题,请指出,不胜荣幸...