效果演示
- 将目的地和对应的攻略分类显示出来
准备工作
表结构
实体类
- 攻略分类实体
- 目的地实体
用于返回数据给前端的Vo部分
@Setter
@Getter
@ToString
public class CatalogVo {
private String destName;
private List<StrategyCatalog> catalogList = new ArrayList<>();
}
控制器层部分
@Autowired
private IStrategyCatalogService strategyCatalogService;
- 共享此数据,即给前端显示出列表的所有数据
业务层实现方法
- 主要的逻辑是sql语句用到了聚合函数
- 将目的地,和对应的所有攻略分类名和攻略分类id查询出来
- 通过mabatisPlus中的listMaps方法, 将sql语句中的数据封装进
List<Map<String, Object>> list
中,然后将这些数据遍历出来,放进vo对象中,给到前端页面即可 - 因为查询出的数据ids和names 都是字符串有
,
,所以另外设一个方法parseCatalog
,将这2个参数放入,把值放进List中返回出来(也就是vo中的攻略分类集合)
@Override
public List<CatalogVo> queryGroupCatalog() {
List<CatalogVo> vos = new ArrayList<>();
QueryWrapper<StrategyCatalog> wrapper = new QueryWrapper<>();
wrapper.select("dest_name,GROUP_CONCAT(name) names,GROUP_CONCAT(id) ids")
.groupBy("dest_name");
List<Map<String, Object>> list = super.listMaps(wrapper);
for (Map<String,Object> map:list){
CatalogVo vo = new CatalogVo();
vo.setDestName(map.get("dest_name").toString());
String names = map.get("names").toString();
String ids = map.get("ids").toString();
List<StrategyCatalog> catalogList = this.parseCatalog(names,ids);
vo.setCatalogList(catalogList);
vos.add(vo);
}
return vos;
}
private List<StrategyCatalog> parseCatalog(String names, String ids) {
List<StrategyCatalog> list = new ArrayList<>();
String[] ns = names.split(",");
String[] is = ids.split(",");
if (ns.length > 0){
for (int i=0;i<ns.length;i++){
String name = ns[i];
String id = is[i];
if (!StringUtils.hasLength(name)){
continue;
}
StrategyCatalog catalog = new StrategyCatalog();
catalog.setName(name);
catalog.setId(Long.parseLong(id));
list.add(catalog);
}
}
return list;
}