数据库结构
id:节点主键
name:节点名称
pid:上一级节点id,为空表示为祖节点
ancestor:该节点以上所有父节点id集合表示,用作模糊查询,例如:我要查询“新村泵站”下的所有子节点,那么sql查询是加上
where ancestor like ':1:'(‘1’ 为 “新村泵站”节点主键)
创建java实体类
@Data
public class EventType{
private String id;
private String name;
private String pid;
private String ancestor;
private List<EventType> children = new ArrayList<EventType>();
}
核心方法(转换为树结构java实体)
public class TreeUtil1<T> {
public TreeUtil1() {
}
public List<T> createMenu(List<T> list, String id, String pid,String pidValue) {
List<T> listAll = new ArrayList();
TreeMap map = new TreeMap();
try {
Iterator var6 = list.iterator();
while(var6.hasNext()) {
T t = (T) var6.next();
Field field = t.getClass().getDeclaredField(id);
field.setAccessible(true);
String code = field.get(t).toString();
System.out.println("code === " + code);
map.put(code, t);
}
} catch (IllegalAccessException var10) {
var10.printStackTrace();
} catch (NoSuchFieldException var11) {
var11.printStackTrace();
}
map.forEach((k, tx) -> {
try {
Field field = tx.getClass().getDeclaredField(pid);
Field field1 = tx.getClass().getDeclaredField(id);
field.setAccessible(true);
field1.setAccessible(true);
Object pCode = field.get(tx);
Object code1 = field1.get(tx);
if(Objects.isNull(pidValue)){
if(Objects.isNull(pCode)){
listAll.add((T) tx);
}else{
T pt = (T) map.get(pCode);
Field children = pt.getClass().getDeclaredField("children");
children.setAccessible(true);
List<T> o = (List)children.get(pt);
if (o == null) {
children.set(pt, new LinkedList());
}
((List)children.get(pt)).add(tx);
}
}else {
if (code1.equals(pidValue)) {
listAll.add((T) tx);
} else {
try {
T pt = (T) map.get(pCode);
Field children = pt.getClass().getDeclaredField("children");
children.setAccessible(true);
List<T> o = (List) children.get(pt);
if (o == null) {
children.set(pt, new LinkedList());
}
((List) children.get(pt)).add(tx);
}catch (Exception e){
}
}
}
} catch (Exception var10) {
System.out.print(var10.getMessage());
}
});
return listAll;
}
}
参数含义:
参数1:List<T> list
传入查询出来的原始集合
参数2:String id
传入节点主键的字段名(对应实体中字段名 :‘id’,这里是指的字段名)
参数3:String pid
与参数2相似,对应的是实体中的字段名 :‘pid’
参数4:String pidValue
传入选中节点的id,比如我选中的是查询“新村泵站”这个节点下所有的节点,那么这里的pidValue就是“新村泵站”这个节点的id == 1
调用方法返回后的集合,就是树结构的嵌套关系了。