Jooq 3.19.10代码生成因`object`表名引发编译错误求助
jOOQ升级后表名含
object导致的编译错误解决办法 问题描述
从jOOQ 3.14.16升级至3.19.10后,使用codegen工具生成实体类时出现编译失败。数据库中存在名为object的表,生成的Account.java文件报错:method does not override or implement a method from a supertype。
重现步骤
- 创建测试表,SQL语句如下:
CREATE TABLE jooqtest.account ( id INT, details VARCHAR(32) ); CREATE TABLE jooqtest.object ( obj_id INT, details VARCHAR(32) );
- 代码生成配置文件
jooqtest.xml内容:
<configuration> <jdbc> <driver>org.postgresql.Driver</driver> <url>jdbc:postgresql://localhost:5432/supe</url> <user>supe</user> <password>xxxx</password> </jdbc> <generator> <database> <name>org.jooq.meta.postgres.PostgresDatabase</name> <includes>.*</includes> <excludes></excludes> <inputSchema>jooqtest</inputSchema> </database> <target> <packageName>org.jooqtest</packageName> <directory>entities</directory> </target> </generator> </configuration>
- 执行代码生成命令(JDK 21环境):
java -cp jOOQ-3.19.10/jOOQ-lib/r2dbc-spi-1.0.0.RELEASE.jar:jOOQ-3.19.10/jOOQ-lib/reactive-streams-1.0.3.jar:jOOQ-3.19.10/jOOQ-lib/jakarta.xml.bind-api-3.0.0.jar:jOOQ-3.19.10/jOOQ-lib/jooq-3.19.10.jar:jOOQ-3.19.10/jOOQ-lib/jooq-codegen-3.19.10.jar:jOOQ-3.19.10/jOOQ-lib/jooq-meta-3.19.10.jar:postgresql-42.7.3.jar:. org.jooq.codegen.GenerationTool jooqtest.xml
- 生成代码后的错误对比:
Account.java中的where方法:
/** * Create an inline derived table from this table */ @Override @PlainSQL public Account where(@Stringly.SQL String condition, Object... binds) { return where(DSL.condition(condition, binds)); }
Object.java中的where方法:
/** * Create an inline derived table from this table */ @Override @PlainSQL public Object where(@Stringly.SQL String condition, java.lang.Object... binds) { return where(DSL.condition(condition, binds)); }
错误原因
由于同包下生成了对应object表的Object类,Account.java中的Object... binds被编译器解析为该自定义类,而非java.lang.Object,导致方法签名与父类不匹配,无法正确覆写方法。
解决办法(无需修改数据库表名)
通过jOOQ codegen的配置,给object表生成的类重命名,避免与java.lang.Object冲突。修改jooqtest.xml中的<generator>节点,添加自定义命名策略:
<generator> <!-- 原有database、target配置不变 --> <database> <name>org.jooq.meta.postgres.PostgresDatabase</name> <includes>.*</includes> <excludes></excludes> <inputSchema>jooqtest</inputSchema> </database> <target> <packageName>org.jooqtest</packageName> <directory>entities</directory> </target> <!-- 添加以下命名策略配置 --> <strategy> <matchers> <tables> <table> <!-- 匹配表名object --> <expression>object</expression> <!-- 生成的POJO类名 --> <pojoClass>DbObject</pojoClass> <!-- 生成的表类名 --> <tableClass>DbObject</tableClass> </table> </tables> </matchers> </strategy> </generator>
重新执行代码生成命令后,object表对应的类会被命名为DbObject,此时Account.java中的Object... binds会正确解析为java.lang.Object,编译错误即可解决。
内容的提问来源于stack exchange,提问作者Shyama Praveena
相关产品推荐
相关产品推荐

