zoukankan      html  css  js  c++  java
  • 基于 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调用要好,毕竟响应式编程还是要符合规范
  • 相关阅读:
    MEAN: AngularJS + NodeJS的REST API开发教程
    什么是MEAN全堆栈javascript开发框架
    fputcsv 导出excel,解决内存、性能、乱码、科学计数法问题
    React 高德地图画点画区域放大缩小
    React 拖动布局
    React+TypeScript搭建项目
    js 运算符优先级
    for...in 与 for...of
    前端面试点记录
    Vue 高德地图 路径规划 画点
  • 原文地址:https://www.cnblogs.com/akashicbrother/p/15134054.html
Copyright © 2011-2022 走看看