【问题标题】:Find/Modify/Save or Upsert with Spring Data R2DBC使用 Spring Data R2DBC 查找/修改/保存或 Upsert
【发布时间】:2020-04-03 04:10:04
【问题描述】:
我正在尝试围绕响应式编程,特别是 Spring 和 Spring Data R2DBC。可以帮助我更好地理解它的一件事是进行查找/修改/保存或
对象的“插入”。传统的交互可能如下所示:
Book save(Book book) {
Book existing = repository.findByIsbn(book.getIsbn())
if (existing != null) {
return repository.save(found.copyMutableValuesFrom(book));
}
return repository.save(book);
}
这在 Monos 中看起来如何?我知道如何进行直接查找或直接保存,但更复杂的查找/更新/保存或 upsert 让我望而却步。
谢谢。
【问题讨论】:
标签:
java
project-reactor
spring-data-r2dbc
r2dbc
【解决方案1】:
根据您的要求,它或多或少会这样。
@Transactional
Mono<Book> save(Book book){
return repository.findByIsbn(book.getIsbn())
.flatMap(book -> repository.save(found.copyMutableValuesFrom(book)))
.switchIfEmpty(repository.save(book));
}
- ReactiveCrudRepository 在您调用 findById 时返回
Mono<Book>(类似于 Optional<Book> - 如果它是您的自定义方法,则使其返回 Mono<Book>)
- 如果该书存在,则在我们更新现有书的地方执行第二条语句
- 如果未找到该书,则在我们保存新书的位置执行第三条语句。
它返回一个Mono<Book>