数据库递归获取树

实际开发中用到了对数据库数据进行查询获取到树型数据结构。这里在网上查询后进行了记录:
实体类如下:
主要有用信息为当前组织ID,父组织pid.


/**
 * @program: cloud-service
 * @description: 用户和设备组织
 * @author: Mr.lxq
 * @create: 2019-06-17 14:34
 **/
@Data
@Accessors(chain = true)
@Entity
@Table( name ="sys_organization")
public class Organization implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 父组织id
     */
    private  Long pid;

    /**
     * 组织名称
     */
    @Column(length = 100,unique = true)
    private String organizationName ="";

    /**
     * 组织描述
     */
    @Column(length = 255)
    private String organizationDescription;

    /**
     * 排序字段
     */
    private Long orderColumn;

    /**
     * 负责人
     */
    @Column(length = 100)
    private String leader;

    /**
     * 联系电话
     */
    @Column(length = 100)
    private String phone;

    /**
     * 邮箱
     */
    @Column(length = 100)
    private String email ="";
    /**
     * 部门状态
     * 1 启用,0停用
     */
    private int  status = 1;
    /**
     * 部门所在省
     */
    @Column(length = 20)
    private  String  province;
    /**
     * 部门所在市
     */
    @Column(length = 20)
    private String  city;
    /**
     * 部门所在区县
     */
    @Column(length = 100)
    private String area;
    /**
     * 部门详细地址
     */
    @Column(length = 100)
    private  String detailAddress;
    /**
     * 创建者
     */
    @Column(length = 20)
    private  String createPeople;

    /**
     * 创建时间
     */
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    @Column(columnDefinition = "timestamp default current_timestamp ")
    private Date createTime;
    /**
     * 更新者
     */
    @Column(length = 20)
    private  String updatePeople;
    /**
     * 创建时间
     */
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    @Column(columnDefinition = "timestamp default current_timestamp ")
    private Date updateTime;
}

进行递归操作:
这里数据进行递归操作以后结合layUI在前端进行渲染。


 @GetMapping("/TreeAll")
    public String findTreeAll() {
        List<Organization> all = organizationService.findAll();
        List<OrganzationTree> list = new ArrayList<>();
        HashMap<String, Organization> map = new HashMap<>();
        for (Organization o:all){
            map.put(o.getId()+"",o);
        }
        JSONArray jsonArray = new JSONArray();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("title","root");
        jsonObject.put("id",0);
        jsonObject.put("spread",true);
        jsonObject.put("children",getNodeJson(0L,map));
        jsonArray.add(jsonObject);
        log.error(jsonArray.toJSONString());
       return jsonArray.toJSONString();
    }
    /**
     * 递归处理   数据库树结构数据->树形json
     * @param nodeId
     * @param nodes
     * @return
     */
    public static JSONArray getNodeJson(Long nodeId, Map<String,Organization> nodes){
        //当前层级当前node对象
        Organization cur = nodes.get(nodeId);
        //当前层级当前点下的所有子节点(实战中不要慢慢去查,一次加载到集合然后慢慢处理)
        List<Organization> childList = getChildNodes(nodeId,nodes);
        JSONArray childTree = new JSONArray();
        for (Organization node : childList) {
            JSONObject o = new JSONObject();
            o.put("title", node.getOrganizationName());
            o.put("id", node.getId());
            //递归调用该方法
            JSONArray childs = getNodeJson(node.getId(),nodes);
            if(!childs.isEmpty()) {
                o.put("children",childs);
            }
            childTree.fluentAdd(o);
        }
        return childTree;
    }

    /**
     * 获取当前节点的所有子节点
     * @param nodeId
     * @param nodes
     * @return
     */
    public static List<Organization> getChildNodes(Long nodeId, Map<String,Organization> nodes){
        List<Organization> list = new ArrayList<>();
        for (String key : nodes.keySet() ) {
            if(nodes.get(key).getPid().equals(nodeId)){
                list.add(nodes.get(key));
            }
        }
        return list;
    }

获得到的数据如下:

其中jsonArray 的key是lauUI要求的。
id : 唯一标识
title :显示名称
spread : 是否展开,默认在这里第一层展开。。。

[{
	"children": [{
		"children": [{
			"children": [{
				"id": 12,
				"title": "郑东新区组织"
			}, {
				"id": 6,
				"title": "金水组织"
			}],
			"id": 4,
			"title": "郑州组织"
		}],
		"id": 3,
		"title": "河南"
	}, {
		"children": [{
			"id": 10,
			"title": "朝阳组织"
		}],
		"id": 9,
		"title": "北京"
	}],
	"id": 0,
	"title": "root",
	"spread": true
}]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值