Find/Modify/Save 或更新插入 Spring 数据 R2DBC
Find/Modify/Save or Upsert with Spring Data R2DBC
我正在努力研究响应式编程,特别是 Spring 和 Spring Data R2DBC。可以帮助我更好地理解它的一件事是做一个 find/modify/save 或
"upsert" 一个对象。传统交互可能如下所示:
Book save(Book book) {
Book existing = repository.findByIsbn(book.getIsbn())
if (existing != null) {
return repository.save(found.copyMutableValuesFrom(book));
}
return repository.save(book);
}
Monos 看起来如何?我了解如何直接查找或直接保存,但更复杂的 find/update/save 或 upsert 却让我望而却步。
谢谢。
根据您的要求,大致是这样的。
@Transactional
Mono<Book> save(Book book){
return repository.findByIsbn(book.getIsbn())
.flatMap(book -> repository.save(found.copyMutableValuesFrom(book)))
.switchIfEmpty(repository.save(book));
}
- ReactiveCrudRepository returns
Mono<Book>
当你调用 findById 时(类似于 Optional<Book>
- 如果它是你的自定义方法,请将其设为 return Mono<Book>
)
- 如果书存在,则在我们更新现有书的地方执行第二条语句
- 如果找不到这本书,则在我们保存新书的地方执行第 3 条语句。
return是一个Mono<Book>
我正在努力研究响应式编程,特别是 Spring 和 Spring Data R2DBC。可以帮助我更好地理解它的一件事是做一个 find/modify/save 或 "upsert" 一个对象。传统交互可能如下所示:
Book save(Book book) {
Book existing = repository.findByIsbn(book.getIsbn())
if (existing != null) {
return repository.save(found.copyMutableValuesFrom(book));
}
return repository.save(book);
}
Monos 看起来如何?我了解如何直接查找或直接保存,但更复杂的 find/update/save 或 upsert 却让我望而却步。
谢谢。
根据您的要求,大致是这样的。
@Transactional
Mono<Book> save(Book book){
return repository.findByIsbn(book.getIsbn())
.flatMap(book -> repository.save(found.copyMutableValuesFrom(book)))
.switchIfEmpty(repository.save(book));
}
- ReactiveCrudRepository returns
Mono<Book>
当你调用 findById 时(类似于Optional<Book>
- 如果它是你的自定义方法,请将其设为 returnMono<Book>
) - 如果书存在,则在我们更新现有书的地方执行第二条语句
- 如果找不到这本书,则在我们保存新书的地方执行第 3 条语句。
return是一个Mono<Book>