mysql根据父节点递归查询所有子节点,List转树形结构工具类

本文分享了查询MySQL树状结构的两种实用SQL方法,包括针对不同父节点的查询,并提供了一个Java工具类,用于将查询结果转换为树形结构,方便前端展示。

经常有业务需要递归查询MySQL树形结构某一节点的所有子节点,每次从网上扒拉找都得找半天,索性就自己总结一些自己遇到的比较好用的一些方法。

SQL方法一:

SELECT
	* 
FROM
	(
	SELECT
		t1.*,
	IF
		( FIND_IN_SET( parent_id, @parent_ids ) > 0, @parent_ids := CONCAT( @parent_ids, ',', id ), '0' ) AS ischild 
	FROM
		( SELECT * FROM blade_menu AS t WHERE t.is_deleted = 0 AND client_type = 'dianduyun_app' ORDER BY t.id ASC ) t1,
		( SELECT @parent_ids := '1508255373140103170' ) t2 
	) t3 
WHERE
	ischild != '0'

需要修改的地方

  • parent_id,改为你的父级id字段
  • blade_menu ,改为你的表名称
  • WHERE t.is_deleted = 0 ,改为你的查询条件
  • @parent_ids := ‘1508255373140103170’,值改为你要传入的父级id

执行结果

在这里插入图片描述

SQL方法二:

SELECT
	rd.* 
FROM
	( SELECT * FROM fine_authority_object WHERE parentId IS NOT NULL AND is_deleted = 0 ) rd,
	( SELECT @pid := '2342465874553522423' ) pd 
WHERE
	FIND_IN_SET( parentId, @pid ) > 0 
	AND @pid := concat( @pid, ',', id ) 

UNION
SELECT
	* 
FROM
	fine_authority_object 
WHERE
	FIND_IN_SET( id, @pid ) > 0;

需要修改的地方

  • fine_authority_object ,改为你的表名,以及后面的查询条件进行修改。
  • SELECT @pid := ‘2342465874553522423’ ,值改为你要传的父id的值
  • FIND_IN_SET( parentId, @pid ) ,parentId改为你的父级id字段名

备注:

  • 当前这条SQL是根据多个父节点查询所有子节点(包含自身)
  • 如果不想查询结果包含自身,去掉后边的union

执行结果示例

在这里插入图片描述

Java List转树形结构

另外再分享一个将上面查询出来的list给转成树形结构的形式给前端返回的一个工具类。

 public static List<ReportTemplateVo> listToTree2(List<ReportTemplateVo> list) {
        List<ReportTemplateVo> tree = new ArrayList<>();
        for (ReportTemplateVo ReportTemplateVo : list) {
            //找到根节点
            if (ReportTemplateVo.getParentId().equals("reportlets")) {
                tree.add(findChildren(ReportTemplateVo, list));
            }
        }
        return tree;
    }

    /**
     * 查找ReportTemplateVo的子节点
     * @param ReportTemplateVo
     * @param list
     * @return
     */
    private static ReportTemplateVo findChildren(ReportTemplateVo ReportTemplateVo, List<ReportTemplateVo> list) {
        List<ReportTemplateVo> children = new ArrayList<>();
        for (ReportTemplateVo node : list) {
            if (node.getParentId().equals(ReportTemplateVo.getId())) {
                //递归调用
                children.add(findChildren(node, list));
            }
        }
        ReportTemplateVo.setChildren(children);
        return ReportTemplateVo;
    }

ReportTemplateVo实体:

public class ReportTemplateVo  {
    private static final long serialVersionUID = 1L;
    /**
     * 主键ID
     */
    private String id;

    /**
     * 父节点ID
     */
    private String parentId;

    /**
     * 子孙节点
     */
    private List<ReportTemplateVo> children;

    @ApiModelProperty("节点是否可以被选中")
    private Boolean disabled;

    /**
     * 节点名称
     */
    @ApiModelProperty("节点名称")
    private String title;
 

总结

这两种方法都可以查询到自己想要的数据。然后调用这个方法可以直接生成相应的树形结构,这种东西很常用,又懒得自己写, 所以勤记录,多做备份会省很多事儿,

最后,愿大家都乐意分享一些高效开发小工具,减少重复造轮子~

参考资源链接:[Java+MySQL递归构建树形JSON实例与工具类详解](https://wenku.youkuaiyun.com/doc/6412b714be7fbd1778d49051?utm_source=wenku_answer2doc_content) 在Java Web开发中,树形结构的JSON数据通常用于表示具有层级关系的信息,如目录、菜单等。使用JavaMySQL递归查询构建这样的数据结构,是数据管理和前端展示的重要技术。为了解答这个问题,推荐阅读《Java+MySQL递归构建树形JSON实例与工具类详解》。这份资料将为你提供详细的实现步骤和代码示例。 首先,你需要使用SQL查询MySQL数据库中检索出具有层级关系的数据。在MySQL中,可以使用`WITH RECURSIVE`语句或`START WITH ... CONNECT BY PRIOR`子句来递归查询层级数据。例如: ```sql WITH RECURSIVE subtree AS ( SELECT id, pid, name, 1 AS level FROM directories WHERE pid = -1 UNION ALL SELECT d.id, d.pid, d.name, s.level + 1 FROM directories d INNER JOIN subtree s ON d.pid = s.id ) SELECT * FROM subtree ORDER BY level, id; ``` 这段SQL使用了公用表表达式(CTE)来递归地选择根目录和所有子目录,并赋予它们层级信息。 然后,在Java中,你需要创建一个工具类来处理这些数据,并将它们化为JSON格式。你可以使用`org.json`库或`com.alibaba.fastjson`等库来构建JSON对象。以下是使用`org.json`库的示例代码: ```java import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; public class TreeJsonBuilder { public JSONArray buildJsonTree(List<Node> nodes) { JSONArray jsonArray = new JSONArray(); List<Node> rootNodes = new ArrayList<>(); // 寻找根节点 for (Node node : nodes) { if (node.getPid() == -1) { rootNodes.add(node); } } // 构建JSON树形结构 for (Node rootNode : rootNodes) { jsonArray.put(buildJsonNode(rootNode, nodes)); } return jsonArray; } private JSONObject buildJsonNode(Node node, List<Node> nodes) { JSONObject jsonObject = new JSONObject(); jsonObject.put( 参考资源链接:[Java+MySQL递归构建树形JSON实例与工具类详解](https://wenku.youkuaiyun.com/doc/6412b714be7fbd1778d49051?utm_source=wenku_answer2doc_content)
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千里马不常有

整理不易,点滴助力就是不竭动力

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

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

打赏作者

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

抵扣说明:

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

余额充值