使用 Spring 数据 R2DBC 获取嵌套的 objects

Obtaining a nested objects using Spring Data R2DBC

我是 Project Reactor 和 R2DBC 的新手。如何使用 Spring 数据 R2DBC 反应存储库正确接收 Flux<Child> 并将其与 Mono<Parent> 合并?

Parent:

@Table("parent")
public class Parent{

@Id
private Long id;
private String name;

@Transient
private Flux<Child> children;

Parent存储库:

interface ParentRepository extends ReactiveCrudRepository<Parent, Long> {

@Query()
Mono<Parent> findOneByName(String name);

Child:

@Table("child")
public class Child{

@Id
private Long id;

Child存储库:

interface ChildRepository extends ReactiveCrudRepository<Child, Long> {

@Query()
Flux<Child> findAllByParentId(Long parentId);

Parent持久化适配器:

public Mono<Parent> findParent(String parentName) {
    return parentRepository.findOneByName(parentName)
      //how to invoke childRepository.findAllByParentId()
      //and set this Flux to Parent's Mono

}

我的解决方案是:

public Mono<Parent> findParent(String parentName) {
    return parentRepository.findOneByName(parentName)
      .map(parent -> {
            Flux<Child> children = childRepository.findAllByParentId(parent.getId())
            children.subscribe();
            return parent.setChildren(children );
        });      
}

假设存在withChildren(Flux<Child> children) type method,你可以这样做:

parentRepository.findById(parentId)
    .map(p -> p.withChildren(childRepository.findAllByParentId(parentId)));

但是,这有点奇怪 - 您通常不会在 DAO 上拥有这样的 Flux,因为您需要订阅它并单独管理内容。您通常会使用 List<Child> 代替。对于这种情况,您可以将子流收集为列表,zip() 将相应的 Mono 发布者放在一起,然后将它们组合到最终的 Parent 对象中。

所以假设一个 withChildren(List<Child> children) 方法:

Mono.zip(parentRepository.findById(parentId),
    childRepository.findAllByParentId(parentId).collectList(),
    (t1,t2) -> t1.withChildren(t2));