基於 r2dbc jpa java reactor流式程式設計的查詢合併
阿新 • • 發佈:2021-08-12
前言: 這算是我編寫 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呼叫要好,畢竟響應式程式設計還是要符合規範