You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

重现步骤

  1. 创建测试表,SQL语句如下:
CREATE TABLE jooqtest.account (
  id INT,
  details VARCHAR(32)
);

CREATE TABLE jooqtest.object (
  obj_id INT,
  details VARCHAR(32)
);
  1. 代码生成配置文件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>
  1. 执行代码生成命令(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
  1. 生成代码后的错误对比:
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:47:36