Mybatis报错ReflectionException: There is no getter for property named xxx

应用场景:

// DAO层接口
public List<ValidUrl> findValidList(Boolean enable); // 注意这里是Boolean类型,而不是基本数据类型boolean
  • 1
  • 2
  <!-- xml sql语句>
  <select id="findValidList" resultMap="ValidUrlMap">
    SELECT id, sourceId, url_pattern, isEnable as enable
    FROM commentsys_url
    <where>
      <if test="enable != null">isEnable = #{enable}</if>
    </where>
  </select>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行报错:ReflectionException: There is no getter for property named ‘enable’ in ‘class java.lang.Boolean’

解决办法:

1.使用@Param注解标识参数

public List<ValidUrl> findValidList(@Param("enable")Boolean enable)
  •  

注:这种方式只需要在接口中添加@Param注解即可。

2.使用_parameter表示if test=“”中代替enable

  <!-- xml sql语句>
  <select id="findValidList" resultMap="ValidUrlMap">
    SELECT id, sourceId, url_pattern, isEnable as enable
    FROM commentsys_url
    <where>
      <if test="_parameter != null">isEnable = #{enable}</if>
    </where>
  </select>

注:这种方式需要修改if-test语句中使用的参数,用_parameter代替对应的name。

问题分析

乍一看原先的代码是没问题的,但如果联想到Mybatis参数映射的机制就会发现有些东西不一样了。我这里使用了boolean的包装器类型Boolean,这是个Object啊!而我们通常是如何获取对象里的某个值的呢?——get方法。但是Boolean类型并没有实现所谓的get方法,所以肯定会出问题。
这也是为什么以下的语句可以正常运行的原因:

public List<Events> find(User user); // 根据user找对应的事件

<select id="find" parameterType="com.demo.bean.User" resultType="com.demo.bean.Events">
	SELECT * FROM events WHERE userId = #{id}
</select>
  • 于User对象里有get方法啊(不会有人写bean类不实现getter和setter吧?)

这里再阐述一下Mybatis SQL查询参数映射到查询语句时的机制。
相信大家都知道以下两段代码在效果上是一样的:
第一种方式:按name获取

public User find(@Param("name")String name, @Param("password")String password);

<select id="find" resultType="com.demo.bean.User">
	SELECT * FROM user WHERE name = #{name} AND password = #{password}
</select>

第二种方式:按index获取

public User find(String name, String password);

<select id="find" resultType="com.demo.bean.User">
	SELECT * FROM user WHERE name = #{0} AND password = #{1}
</select>

从第二种方式可以看出来了,Mybatis传值的时候实际上是按照顺序传递的。除非使用@Param注解去标识参数们。

备注:文章中使用SELECT *的做法不值得提倡,也建议大家自己定义ResultMap。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值