如何在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
相关产品推荐
相关产品推荐

