当前使用版本(必填,否则不予处理)
验证 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
调整插件顺序,放到分页前面去