@Override public Node getProductCategory(Long shopId) { Node root = new Node(); ProductWriter writer = productDaoManager.getWriter(); List<ProductCategory> productCategoryList = writer.getProductCategoryByShopId(shopId); if (CollectionUtils.isEmpty(productCategoryList)) { return root; } List<Node> nodeList = null; Map<Long, List<Node>> secondTypeMap = new HashMap<Long, List<Node>>(); for (ProductCategory productCategory : productCategoryList) { if (productCategory.getParentId() == null && productCategory.getCategoryType() == ProductCategoryType.TOP_CATEGORY) { root = productCategory.toNode(); } if (productCategory.getCategoryType() == ProductCategoryType.SECOND_CATEGORY) { if (secondTypeMap.get(productCategory.getParentId()) == null) { nodeList = new ArrayList<Node>(); secondTypeMap.put(productCategory.getParentId(), nodeList); } Node node = productCategory.toNode(); secondTypeMap.get(productCategory.getParentId()).add(node); } } List<Node> nodes = new ArrayList<Node>(); for (ProductCategory productCategory : productCategoryList) { if (productCategory.getCategoryType() == ProductCategoryType.FIRST_CATEGORY) { nodeList = secondTypeMap.get(productCategory.getId()); Node node = productCategory.toNode(); if (CollectionUtils.isNotEmpty(nodeList)) { node.setChildren(nodeList); } nodes.add(node); } } root.mergeAndBuildTree(root, nodes); return root; }