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

如何在jOOQ代码生成过程中动态排除对象?

如何基于表属性动态控制jOOQ代码生成的包含/排除?

jOOQ代码生成器默认支持通过<includes>和<excludes>元素,使用静态正则表达式控制代码生成时要包含或排除的对象,示例配置如下:

<configuration>
  <generator>
    <database>
      <includes>.*</includes>
      <excludes>
           UNUSED_TABLE                # 不生成该表(非限定名)
         | PREFIX_.*                   # 不生成带有指定前缀的对象
         | SECRET_SCHEMA\.SECRET_TABLE # 不生成该表(限定名)
         | SECRET_ROUTINE              # 不生成该存储过程(非限定名)...
      </excludes>
    </database>
  </generator>
</configuration>

但这类正则表达式是静态的,无法基于表的属性(比如对象类型、注释等)动态过滤。如果需要实现动态规则(比如排除PostgreSQL中的所有视图),可以采用以下几种方案:

方案一:利用数据库专属配置快速实现(推荐)

针对PostgreSQL这类数据库,jOOQ的代码生成器提供了直接禁用视图生成的配置项。只需在<database>节点中添加<includeViews>false</includeViews>即可:

<configuration>
  <generator>
    <database>
      <name>org.jooq.meta.postgres.PostgresDatabase</name>
      <includeViews>false</includeViews>
      <!-- 其他必要配置,比如数据库连接信息等 -->
    </database>
  </generator>
</configuration>

方案二:自定义Database类实现复杂动态过滤

如果需要更灵活的规则(比如根据表注释、存储引擎等属性过滤),可以自定义Database子类,重写相关方法实现动态过滤:

  1. 编写自定义Database类(以PostgreSQL为例):
import org.jooq.meta.postgres.PostgresDatabase;
import org.jooq.meta.TableDefinition;
import java.util.List;
import java.util.stream.Collectors;

public class CustomPostgresDatabase extends PostgresDatabase {
    @Override
    protected List<TableDefinition> getTables0() {
        // 获取所有原始表/视图定义
        List<TableDefinition> allTables = super.getTables0();
        // 过滤掉所有视图,仅保留普通表
        return allTables.stream()
                .filter(table -> !"VIEW".equals(table.getTableType()))
                .collect(Collectors.toList());
    }
}
  1. 在代码生成配置中引用这个自定义类:
<configuration>
  <generator>
    <database>
      <name>com.yourcompany.yourpackage.CustomPostgresDatabase</name>
      <!-- 其他配置 -->
    </database>
  </generator>
</configuration>

方案三:半静态正则过滤(适合视图固定的场景)

如果视图列表很少变动,可以先查询PostgreSQL系统表获取所有视图名称,再将这些名称添加到<excludes>的正则规则中:

  1. 执行查询获取视图列表:
SELECT table_schema || '.' || table_name FROM information_schema.views;
  1. 将结果整理成正则规则添加到<excludes>中,比如:
<excludes>
  SCHEMA1\.VIEW1|SCHEMA2\.VIEW2|...
</excludes>

内容的提问来源于stack exchange,提问作者Lukas Eder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:39:18