当前位置: 首页 > 知识库问答 >
问题:

Spring数据R2DBC如何查询分层数据

华英睿
2023-03-14

我是反应式编程的新手。我必须开发一个简单的Spring启动应用程序来返回一个json响应,其中包含公司及其所有子公司和员工的详细信息

创建了一个Spring Boot应用程序(Spring Webflow Spring data r2dbc)

使用以下数据库表来表示公司和子公司以及员工关系(这是一种与公司和子公司的层次关系,其中一个公司可以有N个子公司,而这些子公司中的每个子公司可以有另N个子公司等)

  • id
  • 姓名
  • 地址:
  • id
  • sub_company_id(上面公司表的外键引用id)
  • id
  • 名称
  • 指定
  • company_id(上面公司表的外键引用id)

下面是表示上述表的java模型类

Company.java

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class Company  implements Serializable { 
    private int id;
    private String name;
    private String address;  
    
    @With
    @Transient
    private List<Company> subCompanies;
    
    @With
    @Transient
    private List<Employee> employees;
}

受雇者Java语言

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class Employee  implements Serializable {    
    @Id
    private int id;
    private String name;
    private String designation;  
    
}

创建以下存储库

@Repository
public interface CompanyRepository extends ReactiveCrudRepository<Company, Integer> {

    @Query("select sub.sub_company_id from Company_SubCompany sub inner join  Company c on sub.sub_company_id = c.id   where sub.id = :id")
    Flux<Integer> findSubCompnayIds(int id);
    
    @Query("select * from   Company c  where id = :id")
    Mono<Company> findCompanyById(Integer id);

}

@Repository
public interface EmployeeRepository extends ReactiveCrudRepository<Employee, Integer> {

    @Query("select * from   Employee where company_id = :id")
    Flux<Employee> findEmployeeByCompanyId(Integer id);

}

在Company\u SubCompany表中,超级公司用id-1表示。所以使用这个id,我们现在可以得到超级母公司。

通过以下服务代码,我现在能够获得公司的一级及其员工。但我不知道如何获得所有嵌套的子公司并将其添加到其中

@Service
public class ComanyService {
    
    @Autowired
    CompanyRepository companyRepository;
    
    @Autowired
    EmployeeRepository employeeRepository;

    public Flux<Company> findComapnyWithAllChilds() {

        Flux<Integer> childCompanyIds = companyRepository.findSubCompnayIds(-1);
        Flux<Company> companies = childCompanyIds.flatMap(p -> {
            return Flux.zip(companyRepository.findCompanyById(p),
                    employeeRepository.findEmployeeByCompanyId(p).collectList(),
                    (t1, t2) -> t1.withEmployees(t2));
        });

        return companies;
    }
}

我对反应式、函数式编程和r2dbc非常陌生,所以请帮助我解决我的问题。如果有任何其他更好的方法可用,也将使用该方法。要求是让公司、其所有员工和子公司(高达N页)。

共有1个答案

苏高远
2023-03-14

这段代码可以帮助您,这种方法可以从数据库调用中填充列表对象

public Flux<Company> findComapnyWithAllChilds(){
    return companyRepository.findAll()
            .flatMap(companies ->
                    Mono.just(companies)
                    .zipWith(employeeRepository.findEmployeeByCompanyId(companies.getId()).collectList())
                    .map(tupla -> tupla.getT1().withEmployees(tupla.getT2()))
                        .zipWith(anotherRepository.findAnotherByCompanyId(companies.getId()).collectList())
                        .map(tupla -> tupla.getT1().withAnother(tupla.getT2()))
            );

}

 类似资料:
  • 在Spring数据R2DBC中,我可以使用 在中。 但是,这不会记录绑定为查询参数的实际值。 如何在Spring数据R2DBC中记录查询参数的实际值?

  • 我正在使用DatabaseClient执行sql查询,我不知道如何通过以下方式进行分组:

  • 我有一个这样的实体层次结构。除了一些常见属性外,一些属性仅由少数子类型共享: 使用QueryDSL,我试图根据动态筛选标准搜索人员,如: 这似乎不是正确的方式,然而,我得到了很多错误,比如“薪水”不是一个人的成员。 处理层次实体搜索的各种方法有哪些?为了类型安全,我更喜欢QueryDSL,但使用Spring数据规范的解决方案也可以。 编辑:使用15种不同的搜索标准,搜索标准可能会变得非常复杂。所以

  • 我有3个实体在我的数据库。实体A具有主密钥PK-A,实体B具有主密钥PK-B,实体C具有主密钥PK-C。 实体A与实体B具有1对多关系,实体B与实体C具有1对多关系 我想在Spring Data JPA中基于PK-A(实际上是实体B中的外键)查询实体C。有可能吗? 但这行不通。还有什么建议我可以试试吗?

  • 我是elasticsearch的新手,尝试使用查询、日期直方图和facets从elasticsearch检索索引数据。我有elasticsearch和kibana在服务器上正常运行。现在,我想从elasticsearch中提取特定的索引数据,并在另一个自主开发的应用程序(SpringWeb应用程序)中将其绘制为图形。因此,考虑使用spring数据elasticsearch,但通过互联网找到了使用e

  • 问题内容: 我正在使用Spring Data JPA,当我用来定义一个 WITHOUT 的查询时,它可以工作: 但是,如果我添加第二个参数,则将无法正常工作,Spring将解析该方法的名称,然后抛出 异常 。这是错误吗? 问题答案: 在Spring论坛上提出了一个类似的问题,指出要应用分页,必须派生第二个子查询。因为子查询引用的是相同的字段,所以您需要确保查询对引用的实体/表使用别名。这意味着您在