JOOQ Codegen异常:同时配置表与列规则后所有列被排除
JOOQ Codegen 列排除异常问题解决
问题场景
在JOOQ Codegen配置中,通过<includes>指定了需生成POJO的多张表,同时在<excludes>中配置了这些表中不需要的列,但最终所有列都被排除。需求是仅为指定5张表生成POJO,且只保留这些表中的部分列。
原配置代码片段:
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> </dependencies> <configuration> <jdbc> <driver>${spring.datasource.driver-class-name}</driver> <url>${spring.datasource.url}</url> <username>${spring.datasource.username}</username> <password>${spring.datasource.password}</password> </jdbc> <generator> <generate> <javaTimeTypes>true</javaTimeTypes> </generate> <database> <includes>cart | material_item | size_item | ACCOUNTSALESORG__C | SALESORG__C | CONTACT | USER </includes> <includeExcludeColumns>true</includeExcludeColumns> <excludes>.*\.ACCOUNTSALESORG__C.CREATEDBYID | .*\.ACCOUNTSALESORG__C.LASTMODIFIEDBYID </excludes> <schemata> <schema> <inputSchema>business_new</inputSchema> </schema> <schema> <inputSchema>orchestration_new</inputSchema> </schema> </schemata> </database> <target> <packageName>com.b2b.adidas.sfmc.search.db</packageName> <directory>src/main/java</directory> </target> </generator> </configuration>
问题原因
- 正则表达式格式错误:
<excludes>中的换行和空格会被正则引擎当作匹配字符的一部分,导致匹配逻辑异常,可能误排除所有列。 - 模糊匹配风险:
.*\.ACCOUNTSALESORG__C的写法过于宽泛,可能匹配到非预期的表或列组合,引发意外排除。 <includes>冗余:配置中包含了7张表,但需求是仅生成5张表,冗余的表定义可能干扰匹配逻辑。
解决方案
1. 精简<includes>,仅保留目标5张表
根据需求移除不需要的表(比如CONTACT、USER),确保只包含需要生成POJO的表:
<includes>cart|material_item|size_item|ACCOUNTSALESORG__C|SALESORG__C</includes>
(注意:将表达式写为一行,避免换行/空格干扰正则匹配)
2. 修正<excludes>的正则表达式
使用精准的正则匹配要排除的列,指定schema避免模糊匹配,同时去掉多余的换行和空格:
<excludes>^business_new\.ACCOUNTSALESORG__C\.(CREATEDBYID|LASTMODIFIEDBYID)$</excludes>
^和$确保完整匹配,避免部分匹配导致的误排除- 明确指定schema(
business_new)和表名,匹配更精准 - 用括号分组列名,简化表达式
3. 确保includeExcludeColumns的正确作用
该参数已设置为<includeExcludeColumns>true</includeExcludeColumns>,确保<includes>/<excludes>同时作用于表和列,无需修改。
修改后的核心配置片段
<database> <includes>cart|material_item|size_item|ACCOUNTSALESORG__C|SALESORG__C</includes> <includeExcludeColumns>true</includeExcludeColumns> <excludes>^business_new\.ACCOUNTSALESORG__C\.(CREATEDBYID|LASTMODIFIEDBYID)$</excludes> <schemata> <schema> <inputSchema>business_new</inputSchema> </schema> <schema> <inputSchema>orchestration_new</inputSchema> </schema> </schemata> </database>
验证方式
重新执行JOOQ Codegen插件,检查生成的POJO类:
- 仅包含指定的5张表对应的类
ACCOUNTSALESORG__C类中已移除CREATEDBYID和LASTMODIFIEDBYID字段
内容的提问来源于stack exchange,提问作者palak
相关产品推荐
相关产品推荐

