递归查询树
由于帮老师做的项目里需要有栏目,所以必定也需要一系列子栏目,因此栏目在数据库中的储存结构就大概为
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;
}
以上是从当前节点向下查询所有的子节点,如果需要查询一整条树,则需要先查找到这树的根节点。稍稍修改就可以查询到整颗树。
java
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())));
}