Java中根据两个字段查询数据并形成Map的方式

如题,分页列表接口返回的数据中 preWarningIsUpload字段需要额外查询另外一张表去获取数据判断

 

    /**
     * 反馈文件是否上传table
     *
     * @param pageList 超标数据列表
     * @return table Table<String, String, String> k1:事件ID, k2:事件类型, value:反馈结果表ID
     */
    public Table<String, String, String> isUploadTable(List<AgendaExceedResult> pageList) {
        if (CollectionUtil.isEmpty(pageList)) {
            return HashBasedTable.create();
        }

        List<Map<String, String>> params = new ArrayList<>();
        pageList.forEach(o -> {
            Map<String, String> map = new HashMap<>();
            //设备站点类型
            map.put("incidentId", o.getIncidentId());
            //因子编码
            map.put("incidentType", o.getAlarmType());
            params.add(map);
        });

        List<MaintenanceFeedbackResult> dPolFacts = feedbackResultMapper.batchSelectByCondition(params);
        Table<String, String, String> table = HashBasedTable.create();
        dPolFacts.forEach(o -> table.put(o.getIncidentId(), o.getIncidentType(), o.getId()));
        return table;
    }

构造一个List<Map<String, String>>的列表,遍历resultList中每条数据将incidentId和incidentType加入到Map中

    /**
     * 批量根据事件ID和事件类型查询数据
     *
     * @param list List<Map<String,String>> list
     * @return List<DPolFact>
     */
    List<MaintenanceFeedbackResult> batchSelectByCondition(@Param("list") List<Map<String, String>> list);
    <select id="batchSelectByCondition" resultType="com.scdq.env.voc.dataobject.MaintenanceFeedbackResult">
        select * from d_maintenance_feedback_result
        <where>
            <if test='list != null and list.size() != 0 '>
                and (incident_id,incident_type) IN
                <foreach item='item' index='index' collection='list' open='(' separator=',' close=')'>
                    (#{item.incidentId}, #{item.incidentType})
                </foreach>
            </if>
            and is_delete = 0
        </where>
    </select>

通过上面的sql语句查询数据,并将数据放入guava的HashBasedTable中,该容器的特点是,通过rowKey,columnKey两个值确定一个value值,这样就可以构造出两个条件的Map

 1     /**
 2      * 填充反馈结果文件是否已上传
 3      */
 4     private void fillIsUpload(List<AgendaExceedResult> pageList, List<AgendaExceedPageResVo> result) {
 5         if (CollectionUtil.isEmpty(pageList)) {
 6             return;
 7         }
 8 
 9         Table<String, String, String> uploadTable = isUploadTable(pageList);
10 
11         result.forEach(o -> {
12             String incidentId = o.getIncidentId();
13             String incidentType = o.getIncidentType();
14             String feedbackId = uploadTable.get(incidentId, incidentType);
15             if (ZERO.equals(incidentType)) {
16                 o.setPreWarningIsUpload(StrUtil.isNotBlank(feedbackId) ? Boolean.TRUE : Boolean.FALSE);
17             } else if (ONE.equals(incidentType)) {
18                 o.setFirstLevelIsUpload(StrUtil.isNotBlank(feedbackId) ? Boolean.TRUE : Boolean.FALSE);
19             } else {
20                 o.setSecondLevelIsUpload(StrUtil.isNotBlank(feedbackId) ? Boolean.TRUE : Boolean.FALSE);
21             }
22         });
23     }

 

注意:

  上面List<Map<String, String>>的集合,最好的建议是使用Set<T>而泛型则是一个对象,该对象需重写hashCode和equal方法,利用Set的特性对数据进行去重。

 

posted @ 2022-05-20 16:45  云翊宸  阅读(924)  评论(0编辑  收藏  举报