基于 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调用要好,毕竟响应式编程还是要符合规范
posted @ 2021-08-12 18:02  空明师兄  阅读(589)  评论(0编辑  收藏  举报