Как вернуть сгенерированный идентификатор с помощью API Fluent Data Access в Spring Data R2DBC

Моя база данных автоматически генерирует идентификаторы при вставке новых записей, и я хочу использовать сгенерированный идентификатор в моем коде после завершения вставки. При использовании Statement это может быть достигнуто с помощью следующий подход.

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 в настоящее время, поэтому в моем случае будет оценен подход для вставки идентификатора в следующем стиле кода.

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

Есть ли какое-нибудь решение для этого?


person choasia    schedule 16.10.2020    source источник


Ответы (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)

person Mafor    schedule 16.10.2020
comment
Спасибо за ваш ответ. Я попробовал, однако сгенерированный идентификатор не вернул, а произошло следующее исключение. java.util.NoSuchElementException: column name 'id' does not exist in [LAST_INSERT_ID] Кстати, я использую dev.miku:r2dbc-mysql в сочетании с MySQL 5.7 - person choasia; 18.10.2020
comment
Хм, я тестировал его с H2 и Postgres, так что это, очевидно, проблема с драйвером MySQL. - person Mafor; 18.10.2020
comment
Попробуйте изменить id на LAST_INSERTED_ID в лямбда-выражении карты. - person Mafor; 18.10.2020