一级分类查询显示空结果的 Bug 修复
问题描述
首页左侧分类导航中,点击有子分类的一级分类(如"Java"),文章列表显示为空,但实际上该一级分类下的二级分类(如"SpringBoot")中是有文章的。
直接点击二级分类可以正常显示文章。
复现步骤
- 创建一级分类"Java"(id=1)
- 在一级分类下创建二级分类"SpringBoot"(id=2, parentId=1)
- 发布一篇文章,分类选择"SpringBoot"(category_id=2)
- 在首页点击一级分类"Java" → 显示 0 篇文章
- 点击二级分类"SpringBoot" → 显示 1 篇文章
错误原因
原始代码中,点击分类时直接拿 categoryId 做等值查询:
java// ArticleService.java - 修复前public Page<Article> page(int pageNum, int pageSize, Long categoryId, ...) { LambdaQueryWrapper<Article> wrapper = new LambdaQueryWrapper<>(); if (categoryId != null) { wrapper.eq(Article::getCategoryId, categoryId); // 只查 category_id = 1 } // ...}
SQL 等价于:
sqlSELECT * FROM article WHERE category_id = 1 AND status = 1 AND is_deleted = 0;
但文章的 category_id 存的是二级分类的 ID(2),不是一级分类的 ID(1),所以永远查不到。
根因:一级分类本身不直接关联文章,文章挂在二级分类下。查询一级分类时没有把子分类也纳入查询范围。
解决方案
查询分类时,先查出该分类的所有子分类 ID,然后用 IN 查询替代 = 查询:
修改 ArticleController
java@GetMapping("/list")public Result<Page<Article>> list( @RequestParam(required = false) Long categoryId, ...) { List<Long> categoryIds = null; if (categoryId != null) { // 先把自身加进去 categoryIds = new ArrayList<>(); categoryIds.add(categoryId); // 查出所有子分类 List<Category> children = categoryMapper.selectList( new LambdaQueryWrapper<Category>() .eq(Category::getParentId, categoryId)); // 把子分类 ID 也加进去 categoryIds.addAll(children.stream() .map(Category::getId) .collect(Collectors.toList())); } return Result.ok(articleService.page(pageNum, pageSize, categoryId, tagId, keyword, categoryIds));}
修改 ArticleService
javapublic Page<Article> page(int pageNum, int pageSize, Long categoryId, Long tagId, String keyword, List<Long> categoryIds) { LambdaQueryWrapper<Article> wrapper = new LambdaQueryWrapper<>(); if (categoryIds != null && !categoryIds.isEmpty()) { // 用 IN 代替 =,查询所有相关分类 wrapper.in(Article::getCategoryId, categoryIds); } else if (categoryId != null) { // 无子分类时用等值查询(如果前端直接传单个 ID) wrapper.eq(Article::getCategoryId, categoryId); } // ...}
修复后的 SQL:
sqlSELECT * FROM article WHERE category_id IN (1, 2) -- 一级分类 + 所有子分类 AND status = 1 AND is_deleted = 0;
效果
| 操作 | 修复前 | 修复后 |
|---|---|---|
| 点击一级分类"Java" | 0 篇 | 显示该分类及所有子分类的文章 |
| 点击二级分类"SpringBoot" | 正常 | 正常(无变化) |
| 首页全部文章 | 正常 | 正常(categoryId 为 null,不走 IN 逻辑) |
涉及文件
ArticleController.java— 新增 CategoryMapper 注入,list 方法增加子分类 ID 查询逻辑ArticleService.java— page 方法签名增加List<Long> categoryIds参数,用in替代eq

