0

我看了这个例子:

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 节。插入数据

using (Publisher) 用于接受要插入的对象流。

所以我尝试了:

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

但这并没有做任何事情。为什么会这样,应该如何编写才能工作?

4

1 回答 1

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) 并在 User POJO 中使用注释定义了 @Table 和 @Id .

于 2019-10-14T02:45:47.757 回答