当前使用版本(必填,否则不予处理)
3.3.0
该问题是如何引起的?(确定最新版也有问题再提!!!)
当表名需要动态拼接的表名为his_user和his_user_mapping等的时候,进行动态表名拼接的时候会出现bug
dynamicTableNameParser.setTableNameHandlerMap(new HashMap<String, ITableNameHandler>(2) {{
tables.forEach(table -> put(table, (metaObject, sql, tableName) -> "his_" + BD_ID.get().toLowerCase() + "." + table));
}});
重现步骤(如果有就写完整)
问题出现在ITableNameHandler类中process方法中使用了replaceAll方法,导致表名被重复替换
default String process(MetaObject metaObject, String sql, String tableName) {
String dynamicTableName = dynamicTableName(metaObject, sql, tableName);
if (null != dynamicTableName && !dynamicTableName.equalsIgnoreCase(tableName)) {
return sql.replaceAll(tableName, dynamicTableName);
}
return sql;
}
@Configuration
public class MpConfig {
public static final ThreadLocal<String> BD_ID = new ThreadLocal<>();
private final List<String> tables = Arrays.asList("his_user", "his_user_mapping", "his_user_daily", "his_user_task", "archiving_his_user_task",
"d1", "archiving_d1", "d2", "archiving_d2", "d3", "archiving_d3",
"d4", "archiving_d4", "d5", "archiving_d5", "d6", "archiving_d6",
"d1_1", "d1_2", "d1_3", "d1_4", "d1_5",
"d2_1", "d2_2", "d2_3", "d2_4", "d2_5", "d2_6", "d2_7", "d2_8",
"d3_1", "d3_2", "d3_3", "d3_4", "d3_5", "d3_6", "d3_7", "d3_8",
"d4_1", "d4_2", "d4_3", "d4_4", "d4_5",
"d5_1", "d5_2", "d5_3", "d5_4", "d5_5",
"d6_1", "d6_2", "d6_3", "d6_4", "d6_5");
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
dynamicTableNameParser.setTableNameHandlerMap(new HashMap<String, ITableNameHandler>(2) {{
tables.forEach(table -> put(table, (metaObject, sql, tableName) -> "his_" + BD_ID.get().toLowerCase() + "." + table));
}});
paginationInterceptor.setSqlParserList(Collections.singletonList(dynamicTableNameParser));
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
}
报错信息
Error querying database. Cause: org.postgresql.util.PSQLException: ERROR: cross-database references are not implemented: "his_07iw01.his_07iw01.his_user_mapping"
位置:190
The error may exist in file [C:\Users\BLab\Desktop\palmap\code\machine\doraemon\service-ai-screen-api\target\classes\mapper\HisUserMapper.xml]
The error may involve defaultParameterMap
The error occurred while setting parameters
SQL: SELECT user_id, a.card_num, username, mobile, card_id, card_type FROM his_07iw01.his_user a, his_07iw01.his_07iw01.his_user_mapping b WHERE a.card_num = b.card_num AND a.his_openid = 'oLPT50haK56ccfRUX73SyT6PFwnc' AND b.bind = '1' ORDER BY a.card_num asc
Cause: org.postgresql.util.PSQLException: ERROR: cross-database references are not implemented: "his_07iw01.his_07iw01.his_user_mapping"
位置:190 ; uncategorized SQLException; SQL state [0A000]; error code [0]; ERROR: cross-database references are not implemented: "his_07iw01.his_07iw01.his_user_mapping" 位置:190; nested exception is org.postgresql.util.PSQLException: ERROR: cross-database references are not implemented: "his_07iw01.his_07iw01.his_user_mapping"
Comment From: qmdx
sql 写法表的命名别名规避替换重复问题,框架层也没有很好的替换方案