检查CSDN缺漏文档1:关于单表三级级联查询的功能完整叙述

需求

在看到之前的CSDN所有有关级联查询后,到只有部分到sql,并无所谓的sql之后的操作,下面我提供一个完整版的案例。我这有一个表,里面只有id,categoryCode,categoryName,superId这么几个字段,其中superId:父极id 他是和和id是有关联的

如图
在这里插入图片描述

解决方法

感谢恩师技术顾问:唐杰

先查找级别为1也就是说superid为null的1级别目录

sql 语句

select distinct b1.category_name as categoryName,b1.category_code as categoryCode,b1.id,b1.level as levels from category as b1 , category as b2 ,category AS b3
where b1.id=b2.super_category_id
and b2.id=b3.super_category_id where b1.categorylevel=1

得到结果

在这里插入图片描述

再查找级别为2也就是说superid为1的2级别目录

sql:SELECT distinct b2.category_name AS categoryName,b2.category_code as categoryCode,b2.id,b2.level as levels FROM category AS b1 , category AS b2 ,category AS b3
WHERE b1.id=b2.super_category_id
AND b2.id=b3.super_category_id
AND b1.superId =1 (1就是这些二级目录的父级id)

得到结果

在这里插入图片描述

最后查询最后一级儿子级别的目录(举例父级别为2)

sql:SELECT DISTINCT b3.super_category_id,b3.category_name AS categoryName,b3.id,b3.category_level AS levels,b3.category_code AS categoryCode FROM category AS b1 , category AS b2 ,category AS b3
WHERE b1.id=b2.super_category_id
AND b2.id=b3.super_category_id
AND b3.super_category_id=2

3级目录结果

在这里插入图片描述

定义1级别目录代码

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CategoryDTOLeve1 {
    private String categoryName;
    private String categoryCode;
    private BigInteger id;
    private List<CategoryDTOLeve2> children = Lists.newArrayList();
};

定义2级别目录代码

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CategoryDTOLeve2 {
    private String categoryName;
    private String categoryCode;
    private BigInteger id;
    private List<CategoryDTOLeve3> children = Lists.newArrayList();
};

定义3级别目录代码

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CategoryDTOLeve3 {
    private String categoryName;
    private String categoryCode;
    private BigInteger id;
 
};

service

  List<CategoryDTO> cateGory = brandDao.getCateGory(at.getBasicTable());
            for (CategoryDTO categoryDTO : cateGory) {
                CategoryDTOLeve1 c1 = new CategoryDTOLeve1();
                List<CategoryDTOLeve2> categoryDTOLeve2s = c1.getChildren();
                List<CategoryDTO> categoryByLeve2 = brandDao.getCategoryByLeve2(at.getBasicTable(), categoryDTO.getId());
                for (CategoryDTO categoryDTO2 : categoryByLeve2) {
                    CategoryDTOLeve2 c2 = new CategoryDTOLeve2();

                    List<CategoryDTOLeve3> categoryDTOLeve3s = c2.getChildren();
                    List<CategoryDTO> categoryByLeve3 = brandDao.getCategoryByLeve3(at.getBasicTable(), categoryDTO2.getId());
                    for (CategoryDTO categoryDTO3 : categoryByLeve3) {
                        CategoryDTOLeve3 c3 = new CategoryDTOLeve3();
                        c3.setId(categoryDTO3.getId());
                        c3.setCategoryCode(categoryDTO3.getCategoryCode());
                        c3.setCategoryName(categoryDTO3.getCategoryName());
                        categoryDTOLeve3s.add(c3);
                    }
                    c2.setId(categoryDTO2.getId());
                    c2.setCategoryCode(categoryDTO2.getCategoryCode());
                    c2.setCategoryName(categoryDTO2.getCategoryName());
                    categoryDTOLeve2s.add(c2);
                }

                c1.setId(categoryDTO.getId());
                c1.setCategoryCode(categoryDTO.getCategoryCode());
                c1.setCategoryName(categoryDTO.getCategoryName());
                categoryListDTOS.add(c1);
            }

 
};

Dao

   public List<CategoryDTO> getCateGory(String basicTable) {


        String sql = " select distinct b1.category_name as categoryName , b1.category_code as categoryCode,b1.id as id from "+basicTable+" as b1 , "+basicTable+" as b2 ,"+basicTable+" AS b3\n" +
                " where b1.id=b2.super_category_id  \n" +
                " and  b2.id=b3.super_category_id ";
        Query query = entityManager.createNativeQuery(sql);
        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(CategoryDTO.class));
        List<CategoryDTO> categoryDTOList= query.getResultList();


        return categoryDTOList;

    }

    public List<CategoryDTO> getCategoryByLeve2(String basicTable,BigInteger id) {

        String sql = "SELECT distinct b2.category_name  AS categoryName,b2.category_code as categoryCode,b2.id  as id FROM "+basicTable+" AS b1 , "+basicTable+" AS b2 ,"+basicTable+" AS b3\n" +
                "WHERE b1.id=b2.super_category_id  \n" +
                "AND  b2.id=b3.super_category_id  \n" +
                "AND b1.id="+id;
        Query query = entityManager.createNativeQuery(sql);
        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(CategoryDTO.class));
        List<CategoryDTO> categoryDTOList  = query.getResultList();


        return categoryDTOList;

    }

    public List<CategoryDTO> getCategoryByLeve3(String basicTable,BigInteger id) {

        String sql = "SELECT distinct b3.category_name  AS categoryName,b3.category_code as categoryCode,b3.id as id FROM "+basicTable+" AS b1 , "+basicTable+" AS b2 ,"+basicTable+" AS b3\n" +
                " WHERE b1.id=b2.super_category_id  \n" +
                " AND  b2.id=b3.super_category_id  \n" +
                " and b2.id="+id;
        Query query = entityManager.createNativeQuery(sql);
        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(CategoryDTO.class));
        List<CategoryDTO> categoryDTOList  = query.getResultList();




        return categoryDTOList;
    }

返回Json

"categoryDTOS": [
      {
        "categoryName": "家用电器",
        "categoryCode": "",
        "id": 1,
        "children": [
          {
            "categoryName": "生活电器",
            "categoryCode": "",
            "id": 2,
            "children": [
              {
                "categoryName": "空气净化器",
                "categoryCode": "",
                "id": 13
              }
           ]
             }
         ]
}
 
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值