递归查询树

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

id
title 标题
uri uri
parentColumn 父栏目id

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//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;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}

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

1
2
3
4
5
6
7
8
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())));
}

文章作者: Image
文章链接: https://by.cx/2017/10/07/递归查询树/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 编译程序