1. 程式人生 > 其它 >基於 r2dbc jpa java reactor流式程式設計的查詢合併

基於 r2dbc jpa java reactor流式程式設計的查詢合併

前言: 這算是我編寫 java reactor時候的工作小結了。

有表如下:

TableMapping 如下

mapping_id table_type search
100 A 1
100 B 1
200 B 2

TableA 如下

id name sex
100 張三
200 李四

TableB 如下

id school grade
100 一中 高一
200 一中 高二
需求: 根據TableMapping.search, 結合TableATableB,查詢出詳細資料,也就是
// 例如查詢 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呼叫要好,畢竟響應式程式設計還是要符合規範