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

静态定义的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语句识别,生成预期的指定字段查询。

疑问

  1. 该问题是由jOOQ还是Spring导致的?
  2. 是否存在遗漏的配置或正确用法可以避免这个问题?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:47:33