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

如何在JOOQ查询数据库后映射静态属性至Kotlin数据类?

解决方案:Kotlin数据类静态属性映射(无需SQL硬编码)

由于Kotlin数据类的val属性是不可变的,无法在对象创建后修改,所以必须在构造阶段就传入所有必填参数。针对你的需求,有两种简洁的实现方式,无需在SQL中添加DSL.val():

1. 手动映射(最直接)

先通过fetch()获取JOOQ的Record对象,再逐个转换为目标数据类,手动传入静态枚举值:

jooq
    .select(t.property)
    // from 和 where 子句省略
    .fetch()
    .map { record ->
        MytargetClass(
            property = record.getValue(t.property),
            static_value = MyEnum.MY_VALUE
        )
    }

这种方式完全脱离JOOQ的自动映射逻辑,直接控制数据类的构造,彻底规避枚举方言问题。

2. 自定义RecordMapper(JOOQ风格扩展)

如果需要复用映射逻辑,可以自定义RecordMapper,通过fetchInto()传入:

// 定义映射器
val targetMapper = RecordMapper<Record1<Int>, MytargetClass> { record ->
    MytargetClass(
        property = record.value1(),
        static_value = MyEnum.MY_VALUE
    )
}

// 查询并映射
jooq
    .select(t.property)
    // from 和 where 子句省略
    .fetchInto(targetMapper)

这种方式更贴合JOOQ的设计模式,适合复杂场景下的映射逻辑复用。

为什么你设想的“先创建再赋值”不可行?

Kotlin数据类的val属性是编译期不可变的,一旦对象实例化完成,就无法修改其值。因此必须在构造函数中一次性传入所有必填参数,没有“先创建部分属性再补全”的空间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:35:41