树状类查询组件

有时候我们有查询分类的查询需求,并且我们也不确定会有多少层,需要从顶层查到最底层,可以使用以下两种方法:

一,递归查询法

 @GetMapping(value = "/ttt")
    public  HttpResult hui(){
        LambdaQueryWrapper<Company> queryWrapper=new LambdaQueryWrapper<>();
        queryWrapper.eq(Company::getParentId,-1);
        List<Company> list=companyService.list(queryWrapper);
        List<CompanyRes> companyRes = ConvertUtils.convertList(list, CompanyRes.class);
        getAll(companyRes);
        return HttpResult.ok(companyRes);

    }

   /**
    *多次回调自己实现查询到底的业务
    */
    public void  getAll(List<CompanyRes> list){
        list.stream().map(a->{
            LambdaQueryWrapper<Company> queryWrapper=new LambdaQueryWrapper<>();
            queryWrapper.eq(Company::getParentId,a.getId());
            List<Company> list1=companyService.list(queryWrapper);
            List<CompanyRes> companyRes = ConvertUtils.convertList(list1, CompanyRes.class);
            if (companyRes!=null){
                getAll(companyRes);
                a.setList(companyRes);
            }
            return a;
        }).collect(Collectors.toList());
    }


  /**
   *反参类
   */

@Data
public class CompanyRes {

    @TableId(type = IdType.ID_WORKER)
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;
    /** 公司名称 */
    private String companyName;

    /**
     * 父级公司id
     */
    @JsonSerialize(using = ToStringSerializer.class)
    private Long  parentId;

    /**
     * 公司法人
     */
    private String legalPerson;

    /**
     * 公司地址
     */
    private String companyAddress;

    /**
     * 公司联系方式
     */
    private String companyPhone;

    private List<CompanyRes> list;
}

二,一起查询,代码中构建,以mysql为例

1.先根据顶级父类id,查询出所有的子级数据

SELECT
	ID.LEVEL,
	DATA.* 
FROM
	(
	SELECT
		@ids AS _ids,
		( SELECT @ids := GROUP_CONCAT( id ) FROM 表名 WHERE FIND_IN_SET( parent_id, @ids ) ) AS cids,
		@l := @l + 1 AS LEVEL 
	FROM
		company,
		( SELECT @ids := 顶级父类 id, @l := 0 ) b 
	WHERE
		@ids IS NOT NULL 
	) ID,
	company DATA 
WHERE
	FIND_IN_SET( DATA.id, ID._ids ) 
ORDER BY
	LEVEL,
	id

2.代码中构建树形


class TreeVo {

private int id;


private int pid;


private String name;


private List<TreeVo> list;


}


public List<TreeVo>   getTree(List<TreeVo> list){

 Map<Intager,TreeVo> map=new HashMap<>();

  //将拿到的集合按照id分类为一个map
  for(TreeVo treeVo: list){
   map.put(treeVo.getId(),treeVo);
   }

   List<TreeVo>  list3=new ArrayList<>();
    for(TreeVo treeVo: list){
  TreeVo treeVo1=map.get(treeVo.getPid());

   if(treeVo1==null){//说明为顶级树形
    list3.add(treeVo);
   

    }else{//说明含有父级

    List<TreeVo>  list5= treeVo1.getList();
     if(ObjectUtils.isNotEmpty(list5)){
       list5.add(treeVo);


     }else{
          List<TreeVo>  list0=new ArrayList<>();
         list0.add(treeVo);
       treeVo1.setList(list0);
        
    }


    }

   }


   return list3;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EntyIU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值