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

验证 3.5.3.1(项目版本) 与 3.5.5 (mp 最新版本)均有此问题

该问题是如何引起的?(确定最新版也有问题再提!!!)

因项目历史结构问题需要在不同环境使用不同的 schema 名称,故使用了 mp 的 动态表名插件。在使用 service#list 方法时都可以正常工作,但 page 方法不行,急需解决方案。

重现步骤(如果有就写完整)

将表名定义为 "{placeholder}.actual_table_name", 然后配置了如下的拦截器:

    fun dynamicTableNameInterceptor(): DynamicTableNameInnerInterceptor {
        val interceptor = DynamicTableNameInnerInterceptor()
        interceptor.tableNameHandler = TableNameHandler { _, tableName ->
            //actual replace logic...
            tableName.replace("{placeholder}", ...)
        }
        return interceptor
    }

使用 list 与 page 方法分别读取数据:

    @Test
    fun testDynamicTableNameList() {
        service.list(buildQueryWrapper {
            limit(1)
        })
    }

    @Test
    fun testDynamicTableNamePage() {
        service.page(PageReq(1,1).asMpPage(), buildQueryWrapper {
            limit(1)
        })
    }

其中的 asMpPage 和 limit 方法是项目中的扩展函数,不影响该问题的判断。正常情况下,两个测试方法应该分别读取一条数据并正常返回。

报错信息

实际效果是, list 方法正常完成,但是 page 方法报错

java.util.concurrent.ExecutionException: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "{" "{" at line 1, column 262.

查看 SQL 可以看到生成的 sql 类似于 select * from {placeholder}.actual_table_name,即并没有替换掉表名。

在 interceptor 中加断点可以发现,list 方法正常走了表名替换流程,而 page 方法的调用完全没有走到这里

Comment From: Muyangmin

推测应该是分页的 count 操作中(willDoQuery方法)没有调用动态表名插件所以报错?

Comment From: miemieYaho

调整插件顺序,放到分页前面去