递归查询树

由于帮老师做的项目里需要有栏目,所以必定也需要一系列子栏目,因此栏目在数据库中的储存结构就大概为

id
title 标题
uri uri
parentColumn 父栏目id

因为任何栏目都是和上下栏目关联的,如搜索某栏目的文章,那么子栏目下的文章也是要进行检索的。因此需要关于这一个栏目的完整的树。

主要思路就是查询子节点,若子节点存在再接着查询子节点。

//Column实体类
public class Column {
    private Integer cid;
    private String cname;
    private String uri;
    private String cdescribe;
    private Integer parentColumn=-1;
}
//ColumnEntity实体类
public class ColumnEntity  {
    public Integer cid;
    public String cname;
    public String uri;
    public String describe;
    public List<ColumnEntity> child;
}
public void select(){
        System.out.print(JSON.toJSONString(getColumnChildEntity(58)));
}
public ColumnEntity getColumnChildEntity(Integer cid){
    //查询id为cid的栏目
    Colum column = columnService.selectColumnById(cid);
    //将Column转化为ColumnEntity
    ColumnEntity columnEntity = new ColumnEntity(column);
    //检索以此为父节点的节点
    List<Column> list = columnService.selectColumnByParent(column.getCid());

    List<ColumnEntity> entities = new ArrayList<ColumnEntity>();
    //检索子节点的子节点
    for(int i=0 ;i<list.size();i++){
        //调用getColumnChildEntity()接着查询子节点
        entities.add(getColumnChildEntity(list.get(i).getCid()));
    }
    columnEntity.child=entities;
    //返回最终实体
    return columnEntity;
}

以上是从当前节点向下查询所有的子节点,如果需要查询一整条树,则需要先查找到这树的根节点。稍稍修改就可以查询到整颗树。

 public void selectTree(){
        Column column = columnService.selectColumnById(64);
        //父节点不为空,则寻找父节点
        while(column.getParentColumn()!=-1){
            column=columnService.selectColumnById(column.getParentColumn());
        }
        System.out.print(JSON.toJSONString(getColumnChildEntity(column.getCid())));
    }