一级分类查询空结果Bug修复

2026-07-15wei👁 8 阅读5 分钟阅读📝 1964 字💬 2 评论
一级分类查询空结果Bug修复

一级分类查询显示空结果的 Bug 修复

问题描述

首页左侧分类导航中,点击有子分类的一级分类(如"Java"),文章列表显示为空,但实际上该一级分类下的二级分类(如"SpringBoot")中是有文章的。

直接点击二级分类可以正常显示文章。

复现步骤

  1. 创建一级分类"Java"(id=1)
  2. 在一级分类下创建二级分类"SpringBoot"(id=2, parentId=1)
  3. 发布一篇文章,分类选择"SpringBoot"(category_id=2)
  4. 在首页点击一级分类"Java" → 显示 0 篇文章
  5. 点击二级分类"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 等价于:

sql
SELECT * 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

java
public 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:

sql
SELECT * 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
wei
技术博客作者
1964 字 · 0 评论
2026-07-15

评论 (0)

暂无评论,来写第一条吧

登录后发表评论

分类

友链

关于本站

用 SpringBoot + Nuxt3 搭建的个人技术博客,记录编程之路的思考与收获。

© 2026 好啵博客 · Built with ❤️ & SpringBoot + Nuxt3