3、Mybatis-Plus异常之There is no getter for property named ‘ew‘ in ‘class解决方案

项目使用技术:

SpringBoot2.7.5+MyBatis-plus5.1.2

项目使用场景:

其中Dao层mapper继承com.baomidou.mybatisplus.core.mapper.BaseMapper下的baseMapper</>,
在service层中调用Dao层中mapper继承的方法 selectOne(),出现异常。


问题描述

在如下代码,UserService中调用findUser()方法时,出现异常,报错如下: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'ew' in 'class com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper' at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) at com.sun.proxy.$Proxy103.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:166) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy107.selectList(Unknown Source) at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:173) at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(Unknown Source) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:162) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy107.selectOne(Unknown Source) Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'ew' in 'class com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper' at org.apache.ibatis.reflection.Reflector.getGetInvoker(Reflector.java:387) at org.apache.ibatis.reflection.MetaClass.getGetInvoker(MetaClass.java:164)

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
import org.springframework.cache.annotation.Cacheable;
import java.util.List;

/**
 * @author 
 * @since 2023-01-03
 */
public interface UserMapper extends BaseMapper<User> {

    @Override
    @Cacheable(cacheManager = "userCacheManager", value = "queryUsers")
    List<UseProps> selectList(Wrapper<User> queryWrapper);
}

/**
 * @author 
 * @since 2023-01-03
 */
 @Service
public interface UserService{

	@Resource
    private UserMapper userMapper;

    private User findUser(String username) {
        return userMapper.selectOne(new LambdaQueryWrapper<User>()
                .eq(User::getUsername, username));
    }
    
}

原因分析:

发现BaseMapper中selectOne方法的实现(代码如下)中,第一行是调用selectList方法,由于userMapper 重写了selectList方法
而且参数 没有加@Param(Constants.WRAPPER) ,所以导致 ew找不到 ,抛出异常org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'ew' in 'class com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper

BaseMapper中selectOne方法的实现如下:

	/**
     * 根据 entity 条件,查询一条记录
     * <p>查询一条记录,例如 qw.last("limit 1") 限制取一条记录, 注意:多条数据会报异常</p>
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) {
        List<T> ts = this.selectList(queryWrapper);
        if (CollectionUtils.isNotEmpty(ts)) {
            if (ts.size() != 1) {
                throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records");
            }
            return ts.get(0);
        }
        return null;
    }

解决方案:

public interface UserMapper extends BaseMapper<User> {

    @Override
    @Cacheable(cacheManager = "userCacheManager", value = "queryUsers")
    List<UseProps> selectList(@Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
}

重写的 selectList方法 参数前面加上注解 @Param(Constants.WRAPPER)

### 解决MyBatis中QueryWrapper类没有名为&#39;ew&#39;的属性getter方法导致的ReflectionException异常问题 在使用MyBatis-Plus时,出现`org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named &#39;ew&#39; in &#39;class com.baomidou.mybatisplus.core.conditions.query.QueryWrapper&#39;`错误的原因通常是由于代码中直接传递了`QueryWrapper`对象给Mapper接口的方法,而未正确处理`ew`(即`EntityWrapper`的缩写)相关逻辑[^1]。 MyBatis-Plus的`QueryWrapper`类本身并不包含名为`ew`的属性或其对应的getter方法。此问题通常出现在自定义SQL语句或动态条件查询场景下,例如通过`@Param`注解传递参数时,未正确绑定参数名称与实际SQL中的占位符[^2]。 #### 问题分析 1. **原因一**:如果在Mapper XML文件中直接引用了`ew`作为参数占位符,但实际传递的是`QueryWrapper`对象,则会导致反射异常,因为`QueryWrapper`类中不存在`ew`属性。 2. **原因二**:在调用Mapper方法时,可能误用了`QueryWrapper`对象作为参数,而该方法并未设计为接受`QueryWrapper`类型的参数[^3]。 #### 解决方案 以下是几种常见的解决方法: 1. **检查Mapper接口方法签名** 确保Mapper接口方法的设计符合MyBatis-Plus的规范。例如,对于支持`QueryWrapper`的通用CRUD方法,无需额外传递`QueryWrapper`对象,直接调用即可。如果需要自定义SQL逻辑,请确保参数绑定正确。 ```java @Select("<script>SELECT * FROM table_name WHERE " + "<if test=&#39;queryWrapper != null&#39;>${ew.customSqlSegment}</if>" + "</script>") List<YourEntity> selectByCondition(@Param("queryWrapper") QueryWrapper<YourEntity> queryWrapper); ``` 2. **避免直接使用`ew`占位符** 如果在XML中使用了`${ew.customSqlSegment}`,请确保传递的参数是一个`AbstractWrapper`类型的对象(如`QueryWrapper`)。否则,应明确指定参数名称,并在SQL中正确引用。 ```java QueryWrapper<YourEntity> queryWrapper = new QueryWrapper<>(); queryWrapper.like("field_name", "value"); yourMapper.selectByCondition(queryWrapper); ``` 3. **升级MyBatis-Plus版本** 某些旧版本可能存在兼容性问题,建议升级到最新稳定版本以避免潜在的Bug。例如,从3.x版本升级到5.x版本时,部分API可能有所调整,需仔细阅读官方迁移文档[^1]。 4. **调试与日志排查** 开启MyBatis的日志功能,查看生成的SQL语句是否符合预期。可以通过以下配置启用日志: ```properties mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl ``` #### 示例代码 以下是一个完整的示例,展示如何正确使用`QueryWrapper`并避免反射异常: ```java // 创建QueryWrapper对象 QueryWrapper<YourEntity> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("status", 1).like("name", "test"); // 调用Mapper方法 List<YourEntity> result = yourMapper.selectList(queryWrapper); // 自定义SQL方法 @Select("<script>SELECT * FROM your_table WHERE " + "<if test=&#39;queryWrapper != null&#39;>${ew.customSqlSegment}</if>" + "</script>") List<YourEntity> selectByCustomCondition(@Param("queryWrapper") QueryWrapper<YourEntity> queryWrapper); ``` ### 注意事项 - 确保Mapper接口方法签名与SQL逻辑一致。 - 避免直接在XML中使用未定义的占位符(如`ew`),除非传递的是`AbstractWrapper`类型的对象。 - 升级MyBatis-Plus版本后,需重新验证所有自定义SQL逻辑是否仍能正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白de成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值