当前使用版本(必填,否则不予处理)
3.3.2
该问题是如何引起的?(确定最新版也有问题再提!!!)
配置了动态表名之后,select page报错
重现步骤(如果有就写完整)
我的数据库表都是face + 数字。 face表是不存在的 首先配置文件里面通过PaginationInterceptor定义了动态表名
@Configuration
@Slf4j
public class MybatisPlusConfiguration {
public static ThreadLocal<Integer> repository = new ThreadLocal<>();
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
/*动态表名*/
List<ISqlParser> sqlParserList = new ArrayList<>();
DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
Map<String, ITableNameHandler> tableNameHandlerMap = new HashMap<>();
//face是数据库表名
tableNameHandlerMap.put("face", (metaObject, sql, tableName) -> {
log.info("table name: {}. sql: {}. repository:{}", tableName, sql, repository.get());
return "face" + (repository.get() == null ? "" : repository.get());
});
dynamicTableNameParser.setTableNameHandlerMap(tableNameHandlerMap);
sqlParserList.add(dynamicTableNameParser);
paginationInterceptor.setSqlParserList(sqlParserList);
return paginationInterceptor;
}
}
Mapper层使用默认的Mapper
public interface FaceMapper extends BaseMapper<FaceEntity> {}
Service层调用时采用queryWrapper的方式查询
@Override
public List<FaceEntity> selectAll(int pageNumber, int size) {
Page<FaceEntity> page = new Page<>(pageNumber, size);
OrderItem orderItem =new OrderItem();
orderItem.setColumn("id");
page.setOrders(Collections.singletonList(orderItem));
QueryWrapper<FaceEntity> faceEntityQueryWrapper = new QueryWrapper<>();
//TODO: query wrapper 无条件时会导致动态表名加载失败 异常定位
// faceEntityQueryWrapper.gt("id", 0);
return faceMapper.selectPage(page,faceEntityQueryWrapper).getRecords();
}
如注释所示,条件为空时 就表名就不会替换,不为空时 表名替换,查询正常
报错信息
Exception in thread "main" org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Error: Method queryTotal execution error of sql :
SELECT COUNT(1) FROM face
### The error may exist in com/intellif/aidb/archiver/mapper/FaceMapper.java (best guess)
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Error: Method queryTotal execution error of sql :
SELECT COUNT(1) FROM face
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
at com.sun.proxy.$Proxy58.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForIPage(MybatisMapperMethod.java:134)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:96)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:96)
at com.sun.proxy.$Proxy61.selectPage(Unknown Source)
at com.intellif.aidb.archiver.service.impl.FaceServiceImpl.selectAll(FaceServiceImpl.java:37)
at com.intellif.aidb.archiver.ArchiverApplication.main(ArchiverApplication.java:19)
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Error: Method queryTotal execution error of sql :
SELECT COUNT(1) FROM face
Comment From: dongbaibai
没有复现出来你的问题呢,大兄弟。 讲道理,分页拦截器的拦截是在设置参数之前的,所以跟你设不设置参数好像没有关系
把代码贴出来看看
Comment From: huayanYu
@pizhicheng 无法复现,如本地仍有问题,可fork示例项目,给出一个简单demo。
Comment From: pizhicheng
问题已经复现在https://github.com/pizhicheng/mybatis-plus-samples 执行 com.baomidou.mybatisplus.samples.pagination包目录下的PaginationApplication#main方法即可复现问题
重新复现后发现问题应该是在interceptor的添加先后顺序上
当pageinterceptor 添加在 dynamictableinterceptor 之前的时候,dynamictableinteceptor 分页查询时不生效
不知道这是属于bug还是属于用户体验问题。
在官方有看到有相关顺序的问题,但用词较轻,用的是建议
链接:https://mybatis.plus/guide/interceptor.html#mybatisplusinterceptor 如果确实是设计如此,建议再加上interceptor执行顺序的文档说明
Comment From: miemieYaho
Comment From: t-aest
顺序交换了,不会分页,分页和动态表明就是冲突
Comment From: chaoweiyi
当 new Page<>(1, 100, false),动态表名生效 当 new Page<>(1, 100, true),动态表名失效 与是否count总数有关系