下面是一个查询的方法
BindCardInfo queryBankCard(QueryBankCardReq queryBankCardReq);
对应的xml文件代码如下:
<select id="queryBankCard"
resultType="com.it.myedu.domain.acct.dao.entity.PmgBindCardInfo">
SELECT
bci.bank_card_no
FROM
ele_account ea
LEFT JOIN
account_relative ar ON ea.id = ar.ele_account_id
LEFT JOIN
bind_card_info bci ON bci.id = ar.bank_card_id
WHERE
ea.cust_no = #{queryBankCardReq.custNo}
AND
ea.pay_code = #{queryBankCardReq.payCode}
AND
bci.bank_card_no = #{queryBankCardReq.bankCardNo}
</select>
以上代码在运行时报错如下:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'queryBankCardReq' in 'class com.it.myedu.domain.acct.controller.req.QueryBankCardReq'
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2323313e] was not registered for synchronization because synchronization is not active
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
at com.sun.proxy.$Proxy111.selectOne(Unknown Source)
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2323313e]
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:159)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:90)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
可以看到关键错误是:There is no getter for property named 'queryBankCardReq' in 'class com.it.myedu.domain.acct.controller.req.QueryBankCardReq'
。
一开始以为实体类没有写set/get方法。但是这里使用了@Data注解,所以排除这个问题,继续排查。
修改代码如下,在接口方法中使用@Param注解:
BindCardInfo queryBankCard(@Param("queryBankCardReq") QueryBankCardReq queryBankCardReq);
问题得到解决。
mybatis会自动识别queryBankCardReq对象的值,传到xml文件中,所以需要给对象指定映射。在接口方法中给queryBankCardReq对象添加上@Param注解,可解决这个问题。
@Param注解的作用就是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 。