Найти / Изменить / Сохранить или Вставить с помощью Spring Data R2DBC - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь сосредоточиться на реактивном программировании, особенно с Spring и Spring Data R2DB C. Одна вещь, которая помогла бы мне лучше понять это, - найти / изменить / сохранить или «вставить» объект. Традиционное взаимодействие может выглядеть так:

Book save(Book book) {

   Book existing = repository.findByIsbn(book.getIsbn())

   if (existing != null) {
     return repository.save(found.copyMutableValuesFrom(book));
   }

   return repository.save(book);
}

Как это может выглядеть с Monos? Я понимаю, как сделать прямое нахождение или прямое сохранение, но более сложное обнаружение / обновление / сохранение или вставка ускользает от меня.

Спасибо.

1 Ответ

1 голос
/ 03 апреля 2020

Это будет более или менее так для вашего требования.

@Transactional
Mono<Book> save(Book book){
    return repository.findByIsbn(book.getIsbn())
                    .flatMap(book -> repository.save(found.copyMutableValuesFrom(book)))
                    .switchIfEmpty(repository.save(book));  
}
  1. ReactiveCrudRepository возвращает Mono<Book> при вызове findById (что-то вроде Optional<Book> - если это ваш пользовательский метод, заставить его вернуться Mono<Book>)
  2. Если книга присутствует, выполняется второй оператор, где мы обновляем существующую книгу
  3. , если книга не найдена, третий оператор выполняется там, где мы сохраняем новый книга.

Возвращает Mono<Book>

...