确认

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

当前程序版本

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

Comment From: nieqiurong

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驱动.

Comment From: xtuul

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

Comment From: nieqiurong

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

Image

Comment From: nieqiurong

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))

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

Comment From: xtuul

终于找到原因了,原来在这个库里有一个自建的实体表: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

Comment From: nieqiurong

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

Comment From: xtuul

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>

Comment From: nieqiurong

    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的驱动协议,.

Comment From: nieqiurong

https://github.com/ClickHouse/clickhouse-java/issues/2286

Comment From: nieqiurong

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

Comment From: N3verL4nd

Image

卡在analyze table HIS45.MET_ORD_AUDIT compute statistics 版本,使用上边的MyDefaultQuery解决了 Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production