Prefacio:
En el desarrollo diario, a menudo utilizamos datos de estructura de árbol. La estructura de árbol se usa generalmente para consultar datos que contienen relaciones padre-hijo de múltiples capas. El ID y el nivel del padre se usan como identificadores para hacer que los datos sean más vívidos y mostrar los datos del árbol.
Por ejemplo: estructura organizativa de la empresa.
base de datos:
id————Nombre de la organización————Código de organización——————Código de institución superior
Clase de entidad:
@Data
@Entity
@Table(name = "t_third_org")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class TThirdOrg extends BaseEntity implements Serializable {
private static final long serialVersionUID = -78345174257965697L;
/**
* id
*/
private Long id;
/**
* 机构名称
*/
private String orgName;
/**
* 机构编码
*/
private String orgCd;
/**
* 上级机构编码
*/
private String parentCd;
...
}
Capa controladora:
/**
* 查询所有组织机构
*
* @return 出参
*/
@ApiOperation(value = "查询所有组织机构")
@PostMapping(value = "/queryList")
List<TreeNode> queryList() {
return thirdOrgService.queryList();
}
Capa de servicio:
Implementación específica: utilice la recursividad para superponer datos
/**
* 查询所有组织机构
*
* @return 查询结果
*/
@Override
public List<TreeNode> queryList() {
List<TreeNode> treeNodeList = this.tThirdOrgDao.queryList();
// 调用递归方法 第一层的父级编码为0 此处可以根据具体需求更改
List<TreeNode> nodeList = buildTree(treeNodeList, "0");
return nodeList;
}
/**
* 获取树形结构
*
* @param treeNodeList list数据
* @param parentCd 父id
* @return 树形结构
*/
private List<TreeNode> buildTree(List<TreeNode> treeNodeList, String parentCd) {
List<TreeNode> nodeList = new ArrayList<>();
for (TreeNode node : treeNodeList) {
if (parentCd.equals(node.getParentCd())) {
// 递归构建子树
List<TreeNode> children = buildTree(treeNodeList, node.getOrgCd());
node.setChildren(children);
nodeList.add(node);
}
}
return nodeList;
}
Capa de Dao:
/**
* 查询所有组织机构
*
* @return 查询结果
*/
@Query(value = "select * from t_third_org where is_deleted = 0", nativeQuery = true)
List<TreeNode> queryList();
Extensión: implementar métodos recursivos usando transmisiones
/**
* 使用stream获取树形结构
*
* @param treeNodeList list数据
* @param parentCd 父id
* @return 树形结构
*/
private static List<TreeNode> buildTree(List<TreeNode> treeNodeList, String parentCd) {
// 使用stream获取树形结构
List<TreeNode> nodeList = treeNodeList.stream()
.filter(node -> {
return parentCd.equals(node.getParentCd());
})
.map((node) -> {
// 递归构建子树
node.setChildren(buildTree(treeNodeList, node.getOrgCd()));
return node;
}
).collect(Collectors.toList());
return nodeList;
}