静态定义的List<Field>在jOOQ Repository中不被识别的问题
jOOQ select语句复用实体类字段列表异常问题
之前在insert语句中使用实体类内定义的字段列表模式一直正常,但将其复用在select语句时出现异常:本该生成select col_1, col_2 from ...的查询语句,实际执行时jOOQ却生成了select * from ...。由于存在关联查询,必须生成带表前缀的select table.col_1, table.col_2 from ...才能避免字段冲突,但目前的异常行为直接导致冲突风险。
将实体类中的ENTITY_FIELDS声明移至Repository类中后,查询恢复正常,能生成预期的指定字段查询语句。即使仅保留ID字段,实体类内的字段列表在select时仍会被jOOQ识别为无效字段并替换为*。当前使用环境为Spring Boot 3.2.2 + jOOQ 3.17.6。
简化代码示例
实体类(Groovy)
class SomeEntity { static class COLUMNS { public static final String COL_1 = 'col_1' public static final String COL_2 = 'col_2' // ...省略其他字段定义 } static class FIELDS { public static final Field<String> COL_1 = DSL.field(COLUMNS.COL_1, String) public static final Field<String> COL_2 = DSL.field(COLUMNS.COL_2, String) // ...省略其他类型字段(Boolean、LocalDateTime、BigDecimal等) } static List<Field<?>> ENTITY_FIELDS = [FIELDS.COL_1, FIELDS.COL_2] @Column(name = COLUMNS.COL_1) String col1 @Column(name = COLUMNS.COL_2) String col2 }
Repository类
@Repository class SomeEntityRepo { DSLContext jooq SomeEntityRepo(DSLContext jooq) { this.jooq = jooq } SomeEntity findEntityDate(String id) { return jooq.select(ENTITY_FIELDS) .from(table) .where(COL_1.eq(id)) .fetchOneInto(SomeEntity) } }
注:实际代码包含构造注入及关联查询逻辑,此处已精简。
补充排查发现
当实体类中存在额外的Table和跨表Field定义时会触发该问题,将这些定义移至Repository类后,ENTITY_FIELDS可正常被select语句识别,生成预期的指定字段查询。
疑问
- 该问题是由jOOQ还是Spring导致的?
- 是否存在遗漏的配置或正确用法可以避免这个问题?
内容的提问来源于stack exchange,提问作者randy
相关产品推荐
相关产品推荐

