基于 r2dbc jpa java reactor流式编程的查询合并
前言: 这算是我编写 java reactor时候的工作小结了。
有表如下:
|
|
|
需求: 根据TableMapping
.search, 结合TableA
、TableB
,查询出详细数据,也就是
// 例如查询 search = 1
{
"name":"张三",
"sex":"男",
"school":"一中",
"grade":"高一"
}
操作方式
List<FluxToMono> initData = new ArrayList<>();
return tableMappingRepository.findAllBySearchEquals(1)
.reduce(initData, (rd, next) -> {
rd.add(new FluxToMono(next.getTableType(), next.getMappingId()));
return rd;
})
.flatMap(fMap -> {
FluxToMono aFilter = fMap.stream().filter(f -> DeviceTypeEnum.A.getCode().equals(f.getTableType())).findFirst().orElse(FluxToMono.builder().build());
Mono<TableA> a = tableARepository.findFirstById(aFilter.getMappingId());
FluxToMono bFilter = fMap.stream().filter(f -> DeviceTypeEnum.B.getCode().equals(f.getTableType())).findFirst().orElse(FluxToMono.builder().build());
Mono<NoiseMessageRecord> b = tableBRepository.findFirstById(bFiltert.getMappingId());
return Mono.zip(
a.defaultIfEmpty(TableA.builder().build()),
b.defaultIfEmpty(TableB.builder().build()),
(lambdaA, lambdaB) ->
ShowDataVo.builder()
.name(lambdaA.getName())
.sex(lambdaA.getSex())
.school(lambdaB.getSchool())
.grade(lambdaB.getgrade())
.build());
});
知识点:
- Mono.zip 只认识有值,只要有一个无值就无输出
- flatMap 要比 map调用要好,毕竟响应式编程还是要符合规范