1.树形数据删除时候,需要删除子节点,当使用oracle数据库可以用oracle数据库自带函数获取子节点
通过子节点向根节点追朔.
select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid
通过根节点遍历子节点(不包含根节点).
select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid
通过根节点遍历子节点(包含根节点).
select * from persons.dept start with deptid=0 connect by prior deptid=paredeptid
2.直接使用程序获取子节点
IndexCatalogueEntity是树形结构体
@TableName("INDEX_CATALOGUE")
@Data
public class IndexCatalogueEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id主键
*/
@ApiModelProperty(value = "id主键")
@TableId
@TreeId
private String id;
/**
* 父id
*/
@ApiModelProperty(value = "父id")
@NotEmpty(message = "父id不能为空!")
@TreeParent
private String pid;
/**
* 目录编码
*/
@ApiModelProperty(value = "目录编码")
@NotEmpty(message = "目录编码不能为空!")
private String catalogueCode;
/**
* 目录名称
*/
@ApiModelProperty(value = "目录名称")
@NotEmpty(message = "目录名称不能为空!")
private String catalogueName;
/**
* 1 表示横向栏目,2表示子文件夹,3表示具体表单
*/
@ApiModelProperty(value = "目录类型 :1 表示横向栏目,2表示子文件夹,3表示具体表单")
@NotNull(message = "目录类型不能为空!")
private Integer catalogueType;
/**
* 创建者
*/
@ApiModelProperty(value = "创建者")
private String createBy;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
private LocalDateTime createTime;
/**
* 修改者
*/
@ApiModelProperty(value = "修改者")
private String updateBy;
/**
* 修改时间
*/
@ApiModelProperty(value = "修改时间")
private LocalDateTime updateTime;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
private String remarks;
@TreeSub
@TableField(exist = false)
private List<IndexCatalogueEntity> indexCatalogueEntityList;
}
首先获取整个树形结构
List<IndexCatalogueEntity> indexCatalogueTreeList = treeUtil.toTree(indexCatalogueEntities);
然后找出id对应的开始树
IndexCatalogueEntity startEntity = getStartEntity(indexCatalogueTreeList, id);
private IndexCatalogueEntity getStartEntity(List<IndexCatalogueEntity> list,String id) {
for (IndexCatalogueEntity one:list){
if(!one.getId().equals(id)){
if(!CollectionUtils.isEmpty(one.getIndexCatalogueEntityList())){
IndexCatalogueEntity indexCatalogueEntity = getStartEntity(one.getIndexCatalogueEntityList(), id);
return indexCatalogueEntity;
}else{
continue;
}
}else{
return one;
}
}
return null;
}
封装idlist
commonMeth(startEntity.getIndexCatalogueEntityList(),idlist);
private void commonMeth(List<IndexCatalogueEntity> list, List<String> idlist) {
for (IndexCatalogueEntity one:list){
if(!CollectionUtils.isEmpty(one.getIndexCatalogueEntityList())){
List<String> ids = new ArrayList<>();
idlist.add(one.getId());
commonMeth(one.getIndexCatalogueEntityList(),ids);
idlist.addAll(ids);
}else{
idlist.add(one.getId());
}
}
}
整个方法如下
// 程序遍历方式删除,先查询是否有子节点
List<IndexCatalogueEntity> indexCatalogueEntities = this.baseMapper.selectList(Wrappers.<IndexCatalogueEntity>query().lambda());
try {
List<IndexCatalogueEntity> indexCatalogueTreeList = treeUtil.toTree(indexCatalogueEntities);
// 找出id对应的树getStartEntity
IndexCatalogueEntity startEntity = getStartEntity(indexCatalogueTreeList, id);
if(startEntity != null && !(CollectionUtils.isEmpty(startEntity.getIndexCatalogueEntityList()))){
List<String> idlist = new ArrayList<>();
idlist.add(startEntity.getId());
commonMeth(startEntity.getIndexCatalogueEntityList(),idlist);
this.baseMapper.deleteBatchIds(idlist);
log.info("删除的数据为:"+gson.toJson(idlist));
}else{
this.baseMapper.deleteById(id);
log.info("删除的数据id为:"+id);
}
}catch (Exception e){
e.printStackTrace();
throw new IndexException(ExceptionEnum.DELETE_ENTITYS_ERROR);
}