【问题标题】:How to get all sub categories from database in java如何从java中的数据库中获取所有子类别
【发布时间】:2014-03-11 09:02:37
【问题描述】:

我的数据库中有一个树状结构,如下所示。

mysql> select * from categories;
+----+---------------+-----------+
| id | category_name | parent_id |
+----+---------------+-----------+
|  1 | footwear      |        -1 |
|  2 | kids footwear |         1 |
|  3 | for girls     |         2 |
|  4 | sandals       |         3 |
|  5 | electronics   |        -1 |
|  6 | kids          |        -1 |
+----+---------------+-----------+
6 rows in set (0.00 sec)

我想读取一个父类别的所有子类别,表中的-1 显示该类别为父类别或最上层类别。树中可能有任何级别。

一旦用户点击父类别 (-1),我需要显示其所有子类别。我不想在每次点击时再次点击数据库。 我有这样的想法,可以通过将表条目转换为树而不是遍历树来完成,但是从表本身检索一项艰巨的任务变得太复杂了。

我从这个链接中得到了一些想法,可以用另一种方式来做(第二种方法) http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 但在这种方法中,如果我想插入一个新的子类别,我必须修改整个表。

还有其他建议吗?

【问题讨论】:

  • @Neel ??英语请...:)
  • 使用嵌套的 set 方法确实使您能够在单个查询中执行此操作。如果您的父/子级别数量非常有限,那么您可以为每个级别进行连接,因此只使用一个查询。否则,您将不得不读取所有记录并在代码中进行一些复杂的操作,或者您将不得不重复(递归)从数据库中执行选择。
  • 请注意,按照惯例,我们对邻接列表中的孤儿使用 NULL。

标签: java mysql database jdbc relational-database


【解决方案1】:

AFAIK 只有几种可行的方法:

  • 以广度优先方式检索级别,例如通过多次执行查询。此查询可能一次检索多个级别。这就是我们为浅树所做的。
  • 使用您链接的具体化路径/嵌套集。
  • 读取所有行并在代码中构建树,这可能是最简单的方法,并且对于小树仍然可行。对于大型树,您可能会考虑一些缓存机制。

另一种方法可能是使用不同的数据库;)

【讨论】:

    【解决方案2】:

    你必须使用递归函数来解决这种问题

        public String findcategoryList() {
        List<Category> results = dao.findAllCategory();
        LinkedHashMap<String, List<String>> map = new LinkedHashMap();
        LinkedHashMap<Integer, List<Integer>> mapKey = new LinkedHashMap();
        for (Object object : results) {
            Category ee = (Category) object;
            Set<Category> stsd = ee.getSubCategories();
    
            if (stsd != null && stsd.size() > 0 && ee.getCategory() == null) {
                dispaly(stsd, ee, map, mapKey);
            } else if (ee.getCategory() == null) {
                List<String> list = new ArrayList<String>();
                List<Integer> listKey = new ArrayList<Integer>();
                map.put(ee.getCategoryname(), list);
                mapKey.put(ee.getCategoryId(), listKey);
                System.out.println(ee.getCategoryname() + "---- No Child");
                System.out.println(ee.getCategoryId() + "---- No Child");
            }
        }
    
        StringBuilder menu = new StringBuilder();
        System.out.println("------------------Menu Start----------------");
        Set<String> keys = new TreeSet<String>(map.keySet());
        menu.append("<ul class='drop'>");
    
        Set<String> sets = new HashSet<String>();
        if(map.size() == mapKey.size()){
            Iterator<Entry<String, List<String>>> iter1 = map.entrySet().iterator();
            Iterator<Entry<Integer, List<Integer>>> iter2 = mapKey.entrySet().iterator();
            while(iter1.hasNext() || iter2.hasNext()) {
                  Entry<String, List<String>> e1 = iter1.next();
                  Entry<Integer, List<Integer>> e2 = iter2.next();
                  String key = e1.getKey();
                  List<String> child = map.get(key);
                  Integer keyId = e2.getKey();
                  List<Integer> childKey = mapKey.get(keyId);
    
            if (!sets.contains(key)) {
                System.out.println("key : "+key);
                if (child != null && child.size() > 0) {
                    menu.append("<li><a href='#'>").append(key).append("<i class='fa fa-caret-down'></i></a>");
                    menu.append("\n");
                    menu.append("<ul class='sub_menu submenu'>");
                    menu.append("\n");
                }else{
                    menu.append("<li><a href='./viewVideos-"+keyId+"'>").append(key).append("<i class='fa fa-caret-down'></i></a>");
                    menu.append("\n");
                }
                sets.add(key);
                menuCreate(menu, child, childKey, map, mapKey, sets);
                if (child != null && child.size() > 0) {
                    menu.append("</ul>");
                    menu.append("\n");
                }
                 menu.append("</li>");
            }
        }
            }
        menu.append("</ul>");
        //System.out.println(menu.toString());
        return menu.toString();
    }
    
        public static void menuCreate(StringBuilder menu, List<String> child, List<Integer> childKey, Map<String, List<String>> map,
            Map<Integer, List<Integer>> mapKey,
            Set<String> sets) {
        if (child != null && child.size() > 0) {
            // Collections.sort(child, ComparatorUtils.NATURAL_COMPARATOR);
            for (int i=0;i<child.size();i++) {
                List<String> subChild = map.get(child.get(i));
                List<Integer> subChildKey = mapKey.get(childKey.get(i));
                System.out.println("subChild : "+subChild+ " child : " + child + " Value : " + child.get(i));
                menu.append("<li>");
                boolean flag = false;
                if (subChild == null || (child != null && child.size() <= 0)) {
                    menu.append("<a href='./viewVideos-"+childKey.get(i)+"'>");
                    flag = true;
                }
                if(flag){
                    menu.append(child.get(i)).append("<i class='fa fa-caret-right'></i>");
                    menu.append("</a>");
                }else{
                    menu.append("<a href='#'>").append(child.get(i)).append("<i class='fa fa-caret-right'></i></a>");
                }
                menu.append("\n");
                if (subChild != null && subChild.size() > 0) {
                    if (!sets.contains(child.get(i))) {
                        sets.add(child.get(i));
                        menu.append("<ul class='sub_menu submenu'>");
                        menu.append("\n");
                        menuCreate(menu, subChild, subChildKey, map, mapKey, sets);
                        menu.append("</ul>");
                        menu.append("\n");
                    }
                }
                menu.append("</li>");
            }
        }
    }
    
        public void dispaly(Set<Category> msp, Category ee, Map<String, List<String>> map, Map<Integer, List<Integer>> mapKey) {
        for (Category category : msp) {
            Set<Category> stsd = category.getSubCategories();
            if (category.getCategory() != null) {
                if (map.get(category.getCategory().getCategoryname()) == null) {
                    List<String> list = new ArrayList<String>();
                    List<Integer> listKey = new ArrayList<Integer>();
                    list.add(category.getCategoryname());
                    listKey.add(category.getCategoryId());
                    map.put(category.getCategory().getCategoryname(), list);
                    mapKey.put(category.getCategory().getCategoryId(), listKey);
                } else {
                    List<String> list = map.get(category.getCategory().getCategoryname());
                    List<Integer> listKey = mapKey.get(category.getCategory().getCategoryId());
                    list.add(category.getCategoryname());
                    listKey.add(category.getCategoryId());
                    map.put(category.getCategory().getCategoryname(), list);
                    mapKey.put(category.getCategory().getCategoryId(), listKey);
                }
    
                System.out.println(category.getCategory().getCategoryname() + "----" + category.getCategoryname());
                System.out.println(category.getCategory().getCategoryId() + "----" + category.getCategoryId());
            }
            if (stsd != null && stsd.size() > 0) {
                dispaly(stsd, category, map, mapKey);
            }
        }
    

    menu.toString() 将为您提供 html 格式的树形栏。

    【讨论】:

      猜你喜欢
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2019-05-24
      • 2012-12-26
      相关资源
      最近更新 更多