如何在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子类,重写相关方法实现动态过滤:
- 编写自定义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()); } }
- 在代码生成配置中引用这个自定义类:
<configuration> <generator> <database> <name>com.yourcompany.yourpackage.CustomPostgresDatabase</name> <!-- 其他配置 --> </database> </generator> </configuration>
方案三:半静态正则过滤(适合视图固定的场景)
如果视图列表很少变动,可以先查询PostgreSQL系统表获取所有视图名称,再将这些名称添加到<excludes>的正则规则中:
- 执行查询获取视图列表:
SELECT table_schema || '.' || table_name FROM information_schema.views;
- 将结果整理成正则规则添加到
<excludes>中,比如:
<excludes> SCHEMA1\.VIEW1|SCHEMA2\.VIEW2|... </excludes>
内容的提问来源于stack exchange,提问作者Lukas Eder
相关产品推荐
相关产品推荐

