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

JOOQ生成的UserRecord属性为何为可空?如何生成非空属性?

解决JOOQ生成Kotlin实体时非空字段变为可空属性的问题

你的问题核心是JOOQ 3.16.4版本的KotlinGenerator默认不会将数据库非空字段映射为Kotlin非空类型,需通过显式配置开启该特性。

解决方案:修改JOOQ代码生成配置

在build.gradle.kts的generate块中添加以下配置项:

jooq {
    configurations {
        create("main") {
            jooqConfiguration.apply {
                jdbc.apply {
                    url = System.getenv("DB_URL")
                    user = System.getenv("DB_USER")
                    password = System.getenv("DB_PASS")
                }
                generator.apply {
                    name = "org.jooq.codegen.KotlinGenerator"
                    database.apply {
                        name = "org.jooq.meta.mysql.MySQLDatabase"
                        inputSchema = System.getenv("DB_NAME")
                        excludes = "flyway_schema_history"
                    }
                    generate.apply {
                        isDeprecated = false
                        isTables = true
                        isComments = true
                        // 新增以下两行配置
                        isKotlinNotNullPojoAttributes = true
                        isNonnullAnnotations = true // 可选,生成@Nonnull注解增强空安全
                    }
                    target.apply {
                        packageName = "com.example.infra.jooq"
                        directory = "${buildDir}/generated/source/jooq/main"
                    }
                }
            }
        }
    }
}

配置说明

  • isKotlinNotNullPojoAttributes: 开启后,JOOQ会依据数据库字段的NOT NULL约束,将生成的Kotlin属性设置为非空类型(如String而非String?)。
  • isNonnullAnnotations: 可选配置,开启后会为非空属性生成javax.annotation.Nonnull或jakarta.annotation.Nonnull注解,进一步强化空安全检查。

验证效果

重新执行generateJooq任务后,生成的UserRecord.kt属性会变为非空类型:

@Suppress("UNCHECKED_CAST")
open class UserRecord() : UpdatableRecordImpl<UserRecord>(User.USER), Record2<String, String> {

    var id: String
        set(value): Unit = set(0, value)
        get(): String = get(0) as String

    var email: String
        set(value): Unit = set(1, value)
        get(): String = get(1) as String

    // ... 其他代码
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:12:18