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

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 写法表的命名别名规避替换重复问题,框架层也没有很好的替换方案