用弹簧福批量插入Kotlin

时间:2019-09-16 13:37:37

标签: spring-boot kotlin r2dbc

我看了这个例子:

https://github.com/spring-projects/spring-fu/blob/cb7c60eae7c022fe066cfe8bf7fbfb752b9dd64b/samples/kofu-coroutines-r2dbc/src/main/kotlin/com/sample/Repositories.kt#L26

suspend fun save(user: User)=
    client.insert().into<User>().table("users").using(user).await()

这很好。我想使用批量插入方法:

https://docs.spring.io/spring-data/r2dbc/docs/1.0.x/reference/html/#reference,第11.7.2节。插入数据

  

使用(Publisher)来接受要插入的对象流。

所以我尝试了:

client.insert().into<User>().table("users").using(Flux.fromIterable(user)).await()

但是什么也没做。为什么会这样,应该怎么写呢?

1 个答案:

答案 0 :(得分:0)

我刚刚意识到,您没有包括fetch()方法来使DatabaseClient在using()方法之后插入对象。

client.insert()
    .into<User>()
    .table("users")
    .using(Flux.fromIterable(user))
    .fetch()
    .await()

正如我在上面的评论中提到的那样,我的批处理插入仅在流中插入第一个对象。根据发布商的DatabaseClient.InsertSpec,在调用RowsFetchSpec.one()或RowsFetchSpec.first()时,提取操作仅插入单个对象。这导致我在fetch()方法之后添加.all()来获取要插入的所有对象,在您的情况下将是

client.insert()
    .into<User>()
    .table("users")
    .using(Flux.fromIterable(user))
    .fetch()
    .all()
    .await()

您的批处理插入与我的批处理插入之间的唯一其他区别是,我使用Java,并且使用了into(Class table)方法而不是into(String table),并在其中注释了@Table和@Id用户POJO。