Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'page' in 'class com.baomidou.mybatisplus.extension.plugins.pagination.Page'
时间: 2025-06-10 12:02:56 浏览: 28
<think>好的,我现在需要解决用户提出的MyBatis Plus异常问题:Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'page' in 'class com.baomidou.mybatisplus.extension.plugins.pagination.Page'。首先,我得理解这个异常的原因。根据异常信息,MyBatis在尝试访问Page类的page属性时找不到对应的getter方法,这说明在XML映射文件中可能错误地引用了不存在的属性。
接下来,我需要回顾MyBatis的工作原理。MyBatis在解析动态SQL时,会通过OGNL表达式访问对象的属性,而属性名必须与Java Bean的getter方法对应。例如,属性名为page,对应的getter应该是getPage()。如果Page类中没有这个方法,就会抛出这个异常。
然后,我应该检查Page类的源码。查阅MyBatis Plus的Page类文档或源码,发现Page类并没有名为page的属性,而是有current、size等属性。可能用户错误地在XML中使用了#{page},而正确的应该是#{current}或者#{size}。
另外,还要考虑用户是否在分页查询时正确配置了分页插件。如果没有配置,可能会导致分页参数无法正确传递。同时,检查Mapper接口的方法参数是否正确使用了Page类型,并确保在XML中引用的参数名称正确。例如,如果方法参数前使用了@Param("page"),那么在XML中应该使用#{page.current}而不是#{page}。
可能的解决方案包括:更正XML中的属性引用,确保使用Page类存在的属性;检查分页插件的配置;验证方法参数和XML中的参数名称是否一致。如果用户在自定义SQL中需要传递整个分页对象,应使用正确的参数别名,如#{param1.current}当参数是第一个时。
最后,总结常见原因和解决方法,帮助用户系统地排查问题,并提供示例代码说明正确用法,确保用户能够理解并应用解决方案。</think>这个异常表明在使用MyBatis Plus分页查询时,XML映射文件中尝试访问了`Page`对象中不存在的`page`属性。以下是详细分析及解决方案:
---
### **问题根源**
1. **错误属性访问**
MyBatis通过OGNL表达式访问对象属性时,需要对应的`getter`方法。例如`#{page}`会寻找`getPage()`方法,但`Page`类中并不存在这个方法
2. **Page类属性结构**
MyBatis Plus的`Page<T>`类主要包含以下属性(对应的getter):
```java
getCurrent() // 当前页
getSize() // 每页数量
getTotal() // 总记录数
getRecords() // 查询结果集
```
---
### **常见场景及解决方案**
#### **场景1:XML中错误引用属性**
```xml
<!-- 错误写法 -->
<select id="selectPage" resultType="...">
SELECT * FROM table
LIMIT #{page.page}, #{page.size} ❌
</select>
```
**✅ 正确写法**
应使用MyBatis Plus提供的数据库方言自动分页,或使用正确的属性名:
```xml
<!-- 正确属性引用 -->
<select id="selectPage" resultType="...">
SELECT * FROM table
LIMIT #{current}, #{size} ✔️
</select>
```
---
#### **场景2:未启用分页插件**
**缺少分页插件配置**会导致分页参数无法正确解析:
```java
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 关键配置
return interceptor;
}
}
```
---
#### **场景3:参数别名错误**
**Mapper接口方法定义**:
```java
// 错误参数别名 ❌
List<User> selectPage(@Param("page") Page<User> page, @Param("name") String name);
```
**XML中的错误引用**:
```xml
<if test="page != null">
LIMIT #{page.page}, #{page.size} ❌ 属性名错误
</if>
```
**✅ 正确做法**
```java
// 保持参数别名与属性名一致 ✔️
List<User> selectPage(@Param("pg") Page<User> page, @Param("name") String name);
```
```xml
<if test="pg != null">
LIMIT #{pg.current}, #{pg.size} ✔️
</if>
```
---
### **补充验证**
可以通过打印SQL日志确认分页参数是否生效:
```properties
# application.properties
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
```
正常分页查询应输出类似:
```sql
SELECT * FROM table LIMIT 10 OFFSET 0 # 第1页,每页10条
```
---
### **扩展建议**
1. **使用Wrapper自动分页**
推荐使用`Page`对象配合Service层方法:
```java
Page<User> page = new Page<>(1, 10);
userService.page(page, Wrappers.<User>query().eq("status", 1));
```
2. **自定义SQL分页**
需要返回`IPage<T>`类型:
```java
// Mapper接口
IPage<User> selectUserPage(IPage<User> page, @Param("name") String name);
```
```xml
<select id="selectUserPage" resultType="...">
SELECT * FROM user WHERE name = #{name}
</select>
```
---
通过以上调整,可有效解决因属性引用错误导致的分页异常问题。
阅读全文
相关推荐









