【问题标题】:How to return generated ID with Fluent Data Access API in Spring Data R2DBC如何在 Spring Data R2DBC 中使用 Fluent Data Access API 返回生成的 ID
【发布时间】:2021-01-30 12:35:14
【问题描述】:

插入新记录时,我的数据库会自动生成 ID,我想在插入完成后在我的代码中使用生成的 ID。使用Statement时,可以通过following approach来实现。

db.execute("INSERT INTO table (name, state) VALUES(:name, :state)")
    .filter { s, next -> next.execute(s.returnGeneratedValues("id")) }
    .bind("name", name)
    .bind("state", state)
    .map { t -> t.get("id", Long::class.java) }

但是,我目前使用的是Fluent Data Access API,因此在我的情况下,我会赞赏一种以以下代码样式获取插入 ID 的方法。

db.insert().into("table")
    .value("name", name)
    .value("state", state)
    // get generated ID

有什么办法可以实现吗?

【问题讨论】:

    标签: spring kotlin spring-data-r2dbc r2dbc


    【解决方案1】:

    您应该可以使用相同的map 方法:

    db.insert().into("test")
        .value("name", name)
        .value("state", state)
        // Use "LAST_INSERTED_ID" for MySQL
        .map { t -> t.get("id", java.lang.Long::class.java) }
        .one()
    

    (我假设表中生成的ID列名为id

    【讨论】:

    • 感谢您的回复。我试过了,但是生成的ID没有返回,而是出现了以下异常。 java.util.NoSuchElementException: column name 'id' does not exist in [LAST_INSERT_ID] 顺便说一句,我正在使用 dev.miku:r2dbc-mysql 结合 MySQL 5.7
    • 嗯,我已经用 H2 和 Postgres 测试过了,所以这显然是 MySQL 驱动问题。
    • 尝试在地图 lambda 中将 'id' 更改为 'LAST_INSERTED_ID'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多