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。
我正在使用 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。