在使用mybatisplus拦截器时,分页出现问题。
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget());
MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
String id = mappedStatement.getId();
if (!id.contains("cn.induschain.dal.mapper.MainObjectMapper") || UserContextHandler.get() == null || UserContextHandler.get().getOrgIds() == null) {
return invocation.proceed();
}
// 备份原始的分页参数
RowBounds originalRowBounds = (RowBounds) metaObject.getValue("delegate.rowBounds");
RowBounds newRowBounds = new RowBounds(originalRowBounds.getOffset(), originalRowBounds.getLimit());
// 获取到原始sql语句
String sql = statementHandler.getBoundSql().getSql();
// 获取原始的总条数
String countSql = getCountSql(sql);
int originalTotal = getTotal(countSql, mappedStatement, statementHandler.getBoundSql().getParameterObject());
// 修改sql
sql = getSql(sql);
// 更新分页参数
metaObject.setValue("delegate.boundSql.sql", sql);
metaObject.setValue("delegate.rowBounds", newRowBounds);
// 执行查询
Object proceed = invocation.proceed();
if (proceed instanceof IPage) {
IPage page = (IPage) proceed;
page.setTotal(originalTotal);
}
return proceed;
}
将代码拦截后导致分页数据和实际返回数据不一致,于是我想在执行查询之后将返回的数据手动设置分页条数,可是Object proceed为代理对象,无法执行到设置页数。
原因怀疑为mybatisplus的分页插件拦截导致。
目前解决方法为具体拦截sql执行拦截之后手动设置分页数据