子父級選單查詢
阿新 • • 發佈:2021-10-28
1、表結構資料
2、實體類定義
1 public class ParentHMClassify { 2 3 private Integer id; 4 5 private String classifyName; 6 7 private Integer parentId; 8 9 private Integer sort; 10 /** 11 * 子集合 12 */ 13 List<ParentHMClassify> childList; 14 }
3、查詢方法
1 @Autowired2 private HMClassifyMapperCustom classifyMapperCustom; 3 4 @Test 5 public void query() { 6 // 查詢 db 7 List<ParentHMClassify> classifyList1 = classifyMapperCustom.getClassifyList1(); 8 // 存放根節點資訊 9 List<ParentHMClassify> rootList = new ArrayList<>();10 for (ParentHMClassify parent : classifyList1) { 11 if (parent.getParentId() == 0) { 12 // 新增根節點 13 rootList.add(parent); 14 // 找到根節點下面的子節點選單 15 findChilds(parent, classifyList1); 16 } 17 } 18 System.out.println("result:" + JSONObject.toJSONString(rootList));19 } 20 21 /** 22 * 遞迴查詢子節點 23 * 24 * @param root 25 * @param list 26 */ 27 public void findChilds(ParentHMClassify root, List<ParentHMClassify> list) { 28 System.out.println("查詢子節點..."); 29 List<ParentHMClassify> childList = new ArrayList<>(); 30 for (ParentHMClassify menu : list) { 31 if (root.getId() == menu.getParentId()) { 32 childList.add(menu); 33 } 34 } 35 // 子節點不存在,就不需要在遍歷子節點中的節點了 直接返回 36 if (childList.size() == 0) return; 37 // 設定父節點的子節點列表 38 root.setChildList(childList); 39 // 若子節點存在,接著遞迴呼叫該方法,查詢子節點的子節點 40 for (ParentHMClassify childs : childList) { 41 findChilds(childs, list); 42 } 43 }
4、子父級選單資料結構為:
1 [ 2 { 3 "classifyName":"VIP相關模板", 4 "id":4, 5 "parentId":0, 6 "sort":1 7 }, 8 { 9 "childList":[ 10 { 11 "childList":[ 12 { 13 "classifyName":"材料遺失宣告模板", 14 "id":9, 15 "parentId":6, 16 "sort":1 17 }, 18 { 19 "classifyName":"345345", 20 "id":36, 21 "parentId":6, 22 "sort":2 23 } 24 ], 25 "classifyName":"檔案科", 26 "id":6, 27 "parentId":5, 28 "sort":1 29 }, 30 { 31 "childList":[ 32 { 33 "childList":[ 34 { 35 "classifyName":"公正委託書模板", 36 "id":13, 37 "parentId":10, 38 "sort":1 39 }, 40 { 41 "classifyName":"交房委託書", 42 "id":14, 43 "parentId":10, 44 "sort":2 45 }, 46 { 47 "classifyName":"未到場補充協議", 48 "id":15, 49 "parentId":10, 50 "sort":3 51 }, 52 { 53 "classifyName":"未到場授權委託書", 54 "id":16, 55 "parentId":10, 56 "sort":4 57 } 58 ], 59 "classifyName":"買賣材料模板", 60 "id":10, 61 "parentId":7, 62 "sort":1 63 }, 64 { 65 "classifyName":"租賃材料模板", 66 "id":11, 67 "parentId":7, 68 "sort":2 69 } 70 ], 71 "classifyName":"簽約部", 72 "id":7, 73 "parentId":5, 74 "sort":2 75 }, 76 { 77 "childList":[ 78 { 79 "classifyName":"收入證明模板", 80 "id":12, 81 "parentId":8, 82 "sort":1 83 } 84 ], 85 "classifyName":"貸款部", 86 "id":8, 87 "parentId":5, 88 "sort":3 89 } 90 ], 91 "classifyName":"交易服務中心", 92 "id":5, 93 "parentId":0, 94 "sort":2 95 }, 96 { 97 "childList":[ 98 { 99 "childList":[ 100 { 101 "childList":[ 102 { 103 "classifyName":"四級選單", 104 "id":41, 105 "parentId":40, 106 "sort":1 107 } 108 ], 109 "classifyName":"三級選單", 110 "id":40, 111 "parentId":39, 112 "sort":2 113 } 114 ], 115 "classifyName":"二級選單", 116 "id":39, 117 "parentId":38, 118 "sort":1 119 }, 120 { 121 "childList":[ 122 { 123 "childList":[ 124 { 125 "classifyName":"四級選單-1", 126 "id":44, 127 "parentId":43, 128 "sort":1 129 } 130 ], 131 "classifyName":"三級選單-1", 132 "id":43, 133 "parentId":42, 134 "sort":1 135 } 136 ], 137 "classifyName":"二級選單-1", 138 "id":42, 139 "parentId":38, 140 "sort":2 141 } 142 ], 143 "classifyName":"一級選單", 144 "id":38, 145 "parentId":0, 146 "sort":3 147 } 148 ]
5、總結
先查詢所有選單集合資料,然後遍歷選單集合獲取根節點集合,然後呼叫查詢子節點方法並在子節點方法中進行遞迴查詢。如果當前節點沒有子節點,直接return 不需要在進行遞迴查詢。相反如果當前節點有子節點則一直進行遞迴查詢。