建表
CREATE TABLE `s_dict` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_zh_0900_as_cs NOT NULL COMMENT 'id',
`label` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_zh_0900_as_cs DEFAULT NULL COMMENT '标签',
`value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_zh_0900_as_cs DEFAULT NULL COMMENT '标签值',
`type` varchar(255) COLLATE utf8mb4_zh_0900_as_cs DEFAULT NULL COMMENT '类别',
`parent_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_zh_0900_as_cs DEFAULT NULL COMMENT '父级类型',
`sort` int DEFAULT '0' COMMENT '排序',
`comment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_zh_0900_as_cs DEFAULT NULL COMMENT '备注',
`create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_zh_0900_as_cs DEFAULT NULL COMMENT '创建人',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_zh_0900_as_cs DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
`del_flag` int DEFAULT '0' COMMENT '删除状态 0:否 1:是',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_zh_0900_as_cs COMMENT='数据字典表';
实体类
@Data
@TableName("s_dict")
@Schema(name = "s_dict", title = "数据字典实体类")
public class Dict extends BaseEntity {
private static final long serialVersionUID = 1L;
@Schema(title = "标签")
private String label;
@Schema(title = "标签值")
private String value;
@Schema(title = "父级类型")
private String parentId;
@Schema(title = "排序")
private Integer sort;
@Schema(title = "备注")
private String comment;
@TableField(exist = false)
private List<Dict> children;
@Schema(title = "类别")
private String type;
}
递归查询
public List<Dict> recursionAll() {
List<Dict> all = selectDictList();
List<Dict> tops = getTop();
for(Dict dict : tops){
dict.setChildren(getChildrenList(all, dict));
}
return tops;
}
//获取父级节点
private List<Dict> getTop() {
LambdaQueryWrapper<Dict> queryWrapper = new LambdaQueryWrapper<Dict>();
queryWrapper.isNull(Dict::getParentId);
return baseMapper.selectList(queryWrapper);
}
//获取父级节点下所有子节点
private static List<Dict> getChildrenList(List<Dict> dictAll, Dict dict) {
//遍历所有的节点,获取当前父节点的所有子节点
List<Dict> childrenList = dictAll.stream().filter(p -> StringUtils.isNotBlank(p.getParentId()) && p.getParentId().equals(dict.getId())).collect(Collectors.toList());
//递归处理:找到孩子节点的孩子节点,直至其没有孩子节点
for (Dict child : childrenList) {
//当前孩子节点child作为父节点继续遍历
child.setChildren(getChildrenList(dictAll, child));
}
return childrenList;
}