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的特性对数据进行去重。