递归查询

1.返回所有子类id

@RequestMapping(value="/test", method = RequestMethod.GET)
public CommonResultVo test(HttpServletRequest req, Model model) throws ServiceException{
	CommonResultVo result = new CommonResultVo();
	List<String> list = new ArrayList<String>();
	list = getChildList("10BM", list);
	System.out.println(list.size());
	result.setData(list);
	return result;
	
}
private List<String> getChildList(String agentCom,List<String> list) throws ServiceException {
	List<String> agentComList= lacomService.findChildAgentList(agentCom);
	if(CommonUtil.hasValue(agentComList)) {
		for (String child : agentComList) {
			list.add(child);
			getChildList(child,list);
		}
	}
	return list;
}

2.返回分类层级关系(树结构)

@RequestMapping(value = "/getCategoryTree", method = RequestMethod.POST)
@ResponseBody
public List<TreeNode> getCategoryTree(HttpServletRequest req, HttpServletResponse rep, Model model) throws ManagerException {
    Map<String, Object> params = this.builderParams(req, model);
    String conditon = " and level_code= 0 or level_code=1";
    params.put("queryCondition", conditon);
    List<Category> categoryList = categoryManager.findByPage(null, null, null, params);
    List<TreeNode> rootTreeNode = new ArrayList<TreeNode>();
    for (Category category : categoryList) {
        TreeNode treeNode = new TreeNode();
        treeNode.setId(category.getCategoryNo());
        treeNode.setText(category.getCategoryName());
        treeNode.setParentNo(category.getParentNo());
        treeNode.setChecked(false);
        treeNode.setCategoryId(category.getId());
        treeNode.setLevelCode(category.getLevelCode() + "");
        treeNode.setKeyWords(category.getKeywords());
        treeNode.setDirectType(category.getDirectType() + "");
        rootTreeNode.add(treeNode);
    }
    List<TreeNode> menuList = new ArrayList<TreeNode>();//主菜单
    // 先找到所有的一级菜单
    for (int i = 0; i < rootTreeNode.size(); i++) {
        // 一级菜单没有ParentNo
        //if (StringUtils.isBlank(rootTreeNode.get(i).getParentNo())) {
    	if (rootTreeNode.get(i).getLevelCode().equals("0")) { // 一级类别的判断需要使用levelCode 字段
            menuList.add(rootTreeNode.get(i));
        }
    }
    // 为一级菜单设置子菜单,getChild是递归调用的
    for (TreeNode treeNode : menuList/*主菜单*/) {
        treeNode.setChildren(getChild(treeNode.getId(), rootTreeNode/*所有的实体类*/));
    }
    Map<String, Object> jsonMap = new HashMap<String, Object>();
    jsonMap.put("menu", menuList);
    return menuList;
}

private List<TreeNode> getChild(String id/*当前主菜单编码*/, List<TreeNode> rootMenu/*所有的实体类*/) {
    // 子菜单
    List<TreeNode> childList = new ArrayList<TreeNode>();
    for (TreeNode treeNode : rootMenu) {
        // 遍历所有节点,将父菜单id与传过来的id比较
        if (StringUtils.isNotBlank(treeNode.getParentNo())) {
            if (treeNode.getParentNo().equals(id)) {
                childList.add(treeNode);
            }
        }
    }
    // 把子菜单的子菜单再循环一遍
    for (TreeNode treeNode : childList) {// 没有url子菜单还有子菜单
        // 递归
        treeNode.setChildren(getChild(treeNode.getId(), rootMenu));
    }
    // 递归退出条件
    if (childList.size() == 0) {
        return null;
    }
    return childList;
}

递归查询

递归查询

递归查询

3.递归查询sql(oracle)

select * from lacom l start with l.agentcom = ‘10BM’ CONNECT by PRIOR l.agentcom = l.upagentcom

(mysql)

CREATE FUNCTION getChildList(rootId INT)
RETURNS varchar(1000)

BEGIN
DECLARE sTemp VARCHAR(1000);
DECLARE sTempChd VARCHAR(1000);

SET sTemp = '$';
SET sTempChd =cast(rootId as CHAR);

WHILE sTempChd is not null DO
    SET sTemp = concat(sTemp,',',sTempChd);
    SELECT group_concat(id) INTO sTempChd FROM  treeNodes where FIND_IN_SET(pid,sTempChd)>0;
END WHILE;
RETURN sTemp; 

END

看我下面的截图标记的序号分别要注意的要点,

1:你创建的表的主键id,

2:你创建的表名,

3:你创建的表的表示上级的字段,

4:这里可以改可以不改,因为按照mysql这样的情况,如果你的数据库可能将来有多张表会用到递归查询的话,这里最好换个名字,比如getchildListTablename,tablename可以换成你2里面的表名,当然小编这里只是建议。

递归查询