Skip to content

[错误报告]: 新代码生成器异常 #6765

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
3 tasks done
xtuul opened this issue Apr 4, 2025 · 10 comments
Closed
3 tasks done

[错误报告]: 新代码生成器异常 #6765

xtuul opened this issue Apr 4, 2025 · 10 comments
Milestone

Comments

@xtuul
Copy link

xtuul commented Apr 4, 2025

确认

  • 我使用的版本是最新版, 并且使用插件确认过项目里无依赖版本冲突
  • 我已经在 issue 中搜索过, 确认问题没有被提出过
  • 我已经修改标题, 将标题中的 描述 替换为遇到的问题

当前程序版本

3.5.11

问题描述

mybatis plus版本:3.5.11
spring boot版本:3.4.3

使用的新的代码生成器:

FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> builder
                        .author("xxx")
                        .outputDir(PROJECT_PATH + "/src/main/java")
                        .commentDate("yyyy-MM-dd")
                )
                .packageConfig(builder -> builder
                        .parent("com.example")
                        .entity("model")
                        //.controller("controller")
                        .mapper("dao")
                        .xml("dao.xml")
                        .service("service")
                        .serviceImpl("service.impl")
                )
                .strategyConfig(builder -> builder
                        .addInclude(tableNames)
                        .controllerBuilder().disable()
                        .entityBuilder()
                        .enableLombok().naming(NamingStrategy.underline_to_camel)
                        .serviceBuilder().formatServiceFileName("%sIService")
                )
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();

异常如下面,堆栈日志

使用3.5.10.1, 3.5.11都有这样异常,使用3.5.9版本正常

详细堆栈日志

Exception in thread "main" java.lang.RuntimeException: 无法创建文件,请检查配置信息!
    at com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.batchOutput(AbstractTemplateEngine.java:252)
    at com.baomidou.mybatisplus.generator.AutoGenerator.execute(AutoGenerator.java:185)
    at com.baomidou.mybatisplus.generator.FastAutoGenerator.execute(FastAutoGenerator.java:239)
    at cn.maitian.bss.modules.generator.GeneratorCode.main(GeneratorCode.java:48)
Caused by: java.lang.RuntimeException: 读取索引信息:ETL_DEPENDENT_ON错误:
    at com.baomidou.mybatisplus.generator.jdbc.DatabaseMetaDataWrapper.getIndex(DatabaseMetaDataWrapper.java:93)
    at com.baomidou.mybatisplus.generator.query.DefaultQuery.getIndex(DefaultQuery.java:144)
    at com.baomidou.mybatisplus.generator.query.DefaultQuery.convertTableFields(DefaultQuery.java:135)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at com.baomidou.mybatisplus.generator.query.DefaultQuery.queryTables(DefaultQuery.java:86)
    at com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder.getTableInfoList(ConfigBuilder.java:172)
    at com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine.batchOutput(AbstractTemplateEngine.java:233)
    ... 3 more
Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "OWNER": 标识符无效

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:509)
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:461)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1104)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:553)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:269)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:655)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:229)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:41)
    at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:765)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:983)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168)
    at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1362)
    at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:369)
    at oracle.jdbc.OracleDatabaseMetaData.getIndexInfo(OracleDatabaseMetaData.java:3862)
    at com.baomidou.mybatisplus.generator.jdbc.DatabaseMetaDataWrapper.getIndex(DatabaseMetaDataWrapper.java:84)
    ... 9 more
Caused by: Error : 904, Position : 395, Sql = select null as table_cat,
       owner as table_schem,
       table_name,
       0 as NON_UNIQUE,
       null as index_qualifier,
       null as index_name, 0 as type,
       0 as ordinal_position, null as column_name,
       null as asc_or_desc,
       num_rows as cardinality,
       blocks as pages,
       null as filter_condition
from all_tables
where table_name = 'ETL_DEPENDENT_ON'
  and owner = 'BSS_KANYU'
union
select null as table_cat,
       i.owner as table_schem,
       i.table_name,
       decode (i.uniqueness, 'UNIQUE', 0, 1),
       null as index_qualifier,
       i.index_name,
       1 as type,
       c.column_position as ordinal_position,
       c.column_name,
       null as asc_or_desc,
       i.distinct_keys as cardinality,
       i.leaf_blocks as pages,
       null as filter_condition
from all_indexes i, all_ind_columns c
where i.table_name = 'ETL_DEPENDENT_ON'
  and i.owner = 'BSS_KANYU'
  and i.index_name = c.index_name
  and i.table_owner = c.table_owner
  and i.table_name = c.table_name
  and i.owner = c.index_owner
order by non_unique, type, index_name, ordinal_position
, OriginalSql = select null as table_cat,
       owner as table_schem,
       table_name,
       0 as NON_UNIQUE,
       null as index_qualifier,
       null as index_name, 0 as type,
       0 as ordinal_position, null as column_name,
       null as asc_or_desc,
       num_rows as cardinality,
       blocks as pages,
       null as filter_condition
from all_tables
where table_name = 'ETL_DEPENDENT_ON'
  and owner = 'BSS_KANYU'
union
select null as table_cat,
       i.owner as table_schem,
       i.table_name,
       decode (i.uniqueness, 'UNIQUE', 0, 1),
       null as index_qualifier,
       i.index_name,
       1 as type,
       c.column_position as ordinal_position,
       c.column_name,
       null as asc_or_desc,
       i.distinct_keys as cardinality,
       i.leaf_blocks as pages,
       null as filter_condition
from all_indexes i, all_ind_columns c
where i.table_name = 'ETL_DEPENDENT_ON'
  and i.owner = 'BSS_KANYU'
  and i.index_name = c.index_name
  and i.table_owner = c.table_owner
  and i.table_name = c.table_name
  and i.owner = c.index_owner
order by non_unique, type, index_name, ordinal_position
, Error Msg = ORA-00904: "OWNER": 标识符无效

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:513)
    ... 23 more
@nieqiurong
Copy link
Contributor

select null as table_cat,
       owner as table_schem,
       table_name,
       0 as NON_UNIQUE,
       null as index_qualifier,
       null as index_name, 0 as type,
       0 as ordinal_position, null as column_name,
       null as asc_or_desc,
       num_rows as cardinality,
       blocks as pages,
       null as filter_condition
from all_tables
where table_name = 'ETL_DEPENDENT_ON'
  and owner = 'BSS_KANYU'
union
select null as table_cat,
       i.owner as table_schem,
       i.table_name,
       decode (i.uniqueness, 'UNIQUE', 0, 1),
       null as index_qualifier,
       i.index_name,
       1 as type,
       c.column_position as ordinal_position,
       c.column_name,
       null as asc_or_desc,
       i.distinct_keys as cardinality,
       i.leaf_blocks as pages,
       null as filter_condition
from all_indexes i, all_ind_columns c
where i.table_name = 'ETL_DEPENDENT_ON'
  and i.owner = 'BSS_KANYU'
  and i.index_name = c.index_name
  and i.table_owner = c.table_owner
  and i.table_name = c.table_name
  and i.owner = c.index_owner
order by non_unique, type, index_name, ordinal_position

看这SQL能不能在你的数据库里正常执行,如果不行,那你需要更换匹配的ORACLE驱动.

@xtuul
Copy link
Author

xtuul commented Apr 5, 2025

在pl/sql执行了下还是同样的错误!
在java项目里,同样的生成器代码 ,同样的驱动程序,同样的生成表,把mybatis plus换成版本 3.5.9即可正常生成,这是什么原因?是生成机制变了吗?

@nieqiurong
Copy link
Contributor

这是后面增加获取表索引字段信息的,你这个语句都没法执行不晓得你的数据库版本情况了,至少我用的oracle版本执行这语句没得问题。

Image

@nieqiurong
Copy link
Contributor

public static class MyDefaultQuery extends DefaultQuery {

    public MyDefaultQuery(@NotNull ConfigBuilder configBuilder) {
        super(configBuilder);
    }

    @Override
    protected List<DatabaseMetaDataWrapper.Index> getIndex(String tableName) {
        return new ArrayList<>();
    }
}

// 代码指定
FastAutoGenerator.create(url, username, password)
            .dataSourceConfig(ds -> ds.databaseQueryClass(MyDefaultQuery.class))

如果你无法解决,又不需要索引信息,可以这么修改使用。

@xtuul
Copy link
Author

xtuul commented Apr 5, 2025

终于找到原因了,原来在这个库里有一个自建的实体表:all_tables,与代码生成器使用all_tables名字一样,调用时直接调用了这个实体表,所以才出错之前的找不到owner的错误!!!

另外遇到一个场景,我使用3.5.11的生成器,对clickhouse的一张表进行生成,报了错误,这个用3.5.9的生成是没任务错误,正常生成的!

Image

使用你给的方法:

public static class MyDefaultQuery extends DefaultQuery {

    public MyDefaultQuery(@NotNull ConfigBuilder configBuilder) {
        super(configBuilder);
    }

    @Override
    protected List<DatabaseMetaDataWrapper.Index> getIndex(String tableName) {
        return new ArrayList<>();
    }
}

// 代码指定
FastAutoGenerator.create(url, username, password)
            .dataSourceConfig(ds -> ds.databaseQueryClass(MyDefaultQuery.class))

在3.5.11版本,使用上面的,也正常了 !

针对这两次不同场景中代码生成器遇到的错误,感觉3.5.9版本生成方式,更通用和实用一些,个人建议把这种方式设置成缺省方式,对于需要索引的,做成可配置的!!!

非常感谢 @nieqiurong

@nieqiurong
Copy link
Contributor

这是什么驱动,规范的驱动查询ResultSet不应该有null返回的情况,你需要检查是驱动行为还是你使用的什么连接池返回了null值。

@xtuul
Copy link
Author

xtuul commented Apr 6, 2025

spring boot版本:3.4.4
jdk 版本: 17.0.14

驱动都官方的标准驱动

使用3.5.11版本的生成器默认数据源的方式

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>6.2.1</version>
</dependency>
<dependency>
    <groupId>com.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
    <version>0.8.1</version>
</dependency>

@nieqiurong
Copy link
Contributor

    public ClickHouseDataSource(String url, Properties properties) throws SQLException {
        this.driver = new ClickHouseDriver();

        if (driver.isV2(url)) {
            //v2
            this.dataSource = new com.clickhouse.jdbc.DataSourceImpl(url, properties);
        } else {
            //v1
            this.dataSource = new DataSourceV1(url, properties);
        }
    }

只能用v1的驱动协议,.

@nieqiurong
Copy link
Contributor

@nieqiurong
Copy link
Contributor

用3.5.12-SNAPSHOT试试,快照使用参考: https://baomidou.com/getting-started/install

@nieqiurong nieqiurong added this to the 3.5.12 milestone Apr 23, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants