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

