There is no getter for property named 'xxx' in 'class java.lang.String'—Mybatis对sql语句限制

昨天做SSM遇到了一个Mybatis的问题,即ReflectionException: There is no getter for property named 'xxx' in 'class java.lang.String

触发原因:

1、接口方法为单个String类型参数:(多个参数时添加有@Param("XXX")注解,不会有此问题,参照解决方法三)

java:List<XXX> selectAllXXX(String uAccount);

sql:parameterType="java.lang.String";

2、sql中使用了动态sql判断

<select id="selectAllXXX" resultMap="BaseResultMap" parameterType="java.lang.String">
     select 
         <include refid="Base_Column_List" /> 
     from xxx
     <if test="uAccount != null">
         where u_account = #{uAccount,jdbcType=VARCHAR} 
     </if>
    order by e_id asc 
</select>

按理说这样的写法不是应该很合法的吗?但是很奇怪就会抛出ReflectionException这个异常!

以往做项目也没注意过,今天百度了一下,原因是Mybatis对接口参数类型为String类型的sql语句判断做了限制。

源码分析参照这位大神的https://blog.csdn.net/qing_gee/article/details/47122227

 

这里总结了一下网上的三种解决方案,亲测有效:

  1. 将接口方法的参数都封装到HashMap<String, String>或自定义对象的属性中即可,其余不变;这样能在sql语句中直接使用#{key}获取参数值,动态sql的判断(如if、when)语句中也同样的方式可以获取; (sql中parameterType="XXX"的值设为java.util.HashMap)
  2. 将sql判断之处的<if test="YourParamName != null"></if>改为<if test="_parameter != null"></if>即可,其余不变;
  3. 在接口方法functionName(String uAccount)的参数前设置@Param("uAccount")注解即可,其余不变;即functionName(@Param("uAccount")String uAccount)。

 

【希望能对你的问题有所帮助,支持我的话帮忙点个赞吧!】

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值