Mybatis报错There is no getter for property named 'id' in 'class java.lang.String'

昨天运行公司项目的一个模块时,后台报了一个错:

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} 这样的写法也不会报错。

希望能帮助到大家,如有问题,请指出,不胜荣幸...

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值