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

使用Gradle jOOQ插件操作SQLite时,存储后无法返回主键

解决jOOQ操作SQLite后无法返回主键的问题

这是jOOQ结合SQLite时很常见的自增主键返回问题,我来帮你一步步排查解决:

问题根源

SQLite的自增主键机制和MySQL、PostgreSQL这类常见关系型数据库有差异,再加上你使用的jOOQ 3.10.6版本相对老旧,对SQLite的自增主键识别和返回需要额外配置才能生效。

解决方案

1. 调整jOOQ代码生成配置,标记主键为自增标识列

首先要确保jOOQ在生成代码时,能正确识别tree表的id字段是自增主键。修改你的Gradle jOOQ插件配置,补充generator相关的数据库配置:

jooq {
    version = '3.10.6'
    foo(sourceSets.main) {
        jdbc {
            url = "jdbc:sqlite:${projectDir.absolutePath}/foo.sqlite"
            driver = "org.sqlite.JDBC" // 显式指定SQLite驱动类,避免自动识别偏差
        }
        generator {
            database {
                name = 'org.jooq.meta.sqlite.SQLiteDatabase'
                inputSchema = '' // SQLite没有schema概念,留空即可
                includes = 'tree' // 可选:只生成tree表的代码,缩小生成范围
                forcedTypes {
                    forcedType {
                        name = 'INTEGER'
                        expression = 'tree\\.id' // 精准匹配tree表的id字段
                        isPrimaryKey = true
                        isIdentity = true // 关键配置:标记该字段为自增标识列
                    }
                }
            }
        }
    }
}

修改后重新执行generateFooJooqSchemaSource任务,生成新的jOOQ代码。

2. 正确调用方法获取主键

生成新代码后,调用store()方法后应该能直接通过record.getId()拿到生成的主键:

TreeRecord tree = new TreeRecord();
tree.setGroveId(1);
tree.setType(1);
// 设置其他字段...

tree.store();
Integer generatedId = tree.getId(); // 现在应该能正常获取到主键值

如果还是不行,可以改用DSLContext.executeInsert()方法,它会直接返回包含主键的结果集:

TreeRecord tree = new TreeRecord();
tree.setGroveId(1);
tree.setType(1);
// 设置其他字段...

Result<TreeRecord> result = dslContext.executeInsert(tree);
if (!result.isEmpty()) {
    Integer generatedId = result.get(0).getId();
    // 使用生成的主键
}

3. 考虑升级jOOQ版本(可选但推荐)

你使用的jOOQ 3.10.6是2018年的版本,后续版本(比如3.14及以上)对SQLite的自增主键处理做了不少优化,兼容性更好。如果项目允许,建议升级到较新的稳定版本,同时将gradle-jooq-plugin也升级到对应匹配的版本(比如jOOQ 3.17.x对应插件版本6.x)。

4. 确认SQLite表结构正确性

你的表定义CREATE TABLE tree ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ...)是完全正确的,SQLite的AUTOINCREMENT会确保主键严格递增,这部分不需要修改。

总结

优先调整jOOQ代码生成配置,标记id为自增标识列,这是解决问题的核心。如果还是有问题,尝试改用executeInsert()方法,或者考虑升级jOOQ版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:56:55