当前使用版本(必填,否则不予处理)

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还是属于用户体验问题。 在官方有看到有相关顺序的问题,但用词较轻,用的是建议 MyBatis-Plus select page 对 动态表名DynamicTableNameInnerInterceptor兼容异常

链接:https://mybatis.plus/guide/interceptor.html#mybatisplusinterceptor 如果确实是设计如此,建议再加上interceptor执行顺序的文档说明

Comment From: miemieYaho

MyBatis-Plus select page 对 动态表名DynamicTableNameInnerInterceptor兼容异常 MyBatis-Plus select page 对 动态表名DynamicTableNameInnerInterceptor兼容异常

Comment From: t-aest

顺序交换了,不会分页,分页和动态表明就是冲突

Comment From: chaoweiyi

当 new Page<>(1, 100, false),动态表名生效 当 new Page<>(1, 100, true),动态表名失效 与是否count总数有关系