R2DBC:为什么 RowsFetchSpec<T> 运算符 (.all(),.first(),.one()) 发出 onComplete 信号,尽管记录存储在数据库中?

R2DBC: Why are RowsFetchSpec<T> operators (.all(),.first(),.one()) signal onComplete although record is stored in database?

我正在使用 DatabaseClient 构建自定义存储库。在我插入或更新一个项目后,我需要将该行数据添加到 return saved/updated 项目。我无法理解为什么 .all() .first() .one() 没有 return 结果图,尽管我可以看到数据是 inserted/updated 在数据库中。他们只是发出 onComplete 信号。但是 .rowsUpdated() returns 1 行已更新。 我在 H2 和 MS SQL 服务器上观察到这种行为。 我是 R2dbc 的新手。我错过了什么?有什么想法吗?

    @Transactional
    public Mono<Item> insertItem(Item entity){
        return dbClient
                .sql("insert into items (creationdate, name, price, traceid, referenceid) VALUES (:creationDate, :name, :price, :traceId, :referenceId)")
                .bind("creationDate", entity.getCreationDate())
                .bind("name", entity.getName())
                .bind("price", entity.getPrice())
                .bind("traceId", entity.getTraceId())
                .bind("referenceId", entity.getReferenceId())
                .fetch()
                .first() //.all() //.one()
                .map(Item::new)
                .doOnNext(item -> LOGGER.info(String.format("Item: %s", item)));
    }

table 看起来像这样:

CREATE TABLE [dbo].[items](
    [creationdate] [bigint] NOT NULL,
    [name] [nvarchar](32) NOT NULL,
    [price] [int] NOT NULL,
    [traceid] [nvarchar](64) NOT NULL,
    [referenceid] [int] NOT NULL,   
 PRIMARY KEY (name, referenceid)
) 

谢谢!

这是数据库中 insert/update 语句的行为,它不会 return inserted/updated 行。 它 return 是 inserted/updated 行的数量。 它还可以 return 一些由数据库生成的值(例如自动递增,生成的 uuid...),通过添加以下行:

.filter(statement -> statement.returnGeneratedValues())

您可以在参数中指定特定的生成列。但是,这取决于数据库(例如 MySql 只能 return 自动递增列的最后生成的 ID,即使您插入多行)。

如果您想从数据库中获取 inserted/updated 值,您需要执行 select。