Spring Data R2DBC如何查询分层数据



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

创建了一个spring-boot应用程序(spring-Webflux+spring-data r2dbc(

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

公司

  • id
  • 名称
  • 地址

公司_子公司

  • id
  • sub_company_id(外键引用上述公司表的id(

员工

  • id
  • 名称
  • 指定
  • company_id(外键引用上述公司表的id(

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

公司.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;
}

Employee.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_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 leavel(。

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

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()))
);

}

最新更新