确认
当前程序版本
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版本执行这语句没得问题。
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的生成是没任务错误,正常生成的!
使用你给的方法:
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
卡在analyze table HIS45.MET_ORD_AUDIT compute statistics 版本,使用上边的MyDefaultQuery解决了 Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production