You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中JPA查询学生选课数返回空数组的修复方案

问题修复:学生选课数量统计接口返回空数组

需求

获取每位学生所选课程的数量,期望REST接口返回如下格式的JSON:

[
    {
        "name_student": "John",
        "count_course": 5
    },
    {
        "name_student": "Jenny",
        "count_course": 8
    }
]

已实现代码

1. Repository层原生查询

@Query(value ="Select count(*), s.student_name from student s INNER JOIN courses c on c.student_id= s.student_id  group by s.student_name", nativeQuery = true ) 
List<StudentDTO> getIncidentCountByOfficerKPI ()

2. DTO定义

@Data
@NoArgsConstructor
public class StudentDTO {
    Integer count;
    String StudentName;
}

3. Service层

public List<StudentDTO> getStudentCount() {
    return p2StudentRepository.getIncidentCountByOfficerKPI ();
}

4. Controller层

@GetMapping("/Student-count")
public ResponseEntity<StudentDTO> getAllStudentCount() {
    
    List<StudentDTO> selectedCount = p2StudentService.getStudentCount();
    List<StudentDTO> result = new ArrayList<>();
    selectedCount.forEach(i -> {
        StudentDTOitem = new StudentDTO();
        item.setUserName(i.getStudentName());
        item.setCount(i.getCount());
        result.add(item);
    });
    return ResponseEntity.ok(result);
}

问题

使用Postman测试时,接口返回空数组[]


修复方法

1. 修正Repository层查询

原生查询字段需与DTO属性映射,同时调整方法名贴合业务:

@Query(value = "SELECT COUNT(*) AS count, s.student_name AS studentName " +
               "FROM student s " +
               "INNER JOIN courses c ON c.student_id = s.student_id " +
               "GROUP BY s.student_name", nativeQuery = true)
List<StudentDTO> getStudentCourseCount();
  • 给查询字段添加别名AS count和AS studentName,与DTO属性名对应
  • 方法名改为getStudentCourseCount,避免无关命名混淆

2. 调整DTO定义

添加@JsonProperty注解映射JSON字段,修正驼峰命名规范:

@Data
@NoArgsConstructor
public class StudentDTO {
    @JsonProperty("count_course")
    private Integer count;
    
    @JsonProperty("name_student")
    private String studentName;
}
  • 把StudentName改为studentName,符合Java命名规范
  • 用@JsonProperty指定返回JSON的字段名,匹配需求格式

3. 修复Controller层错误

  • 修正返回类型为ResponseEntity<List<StudentDTO>>,对应集合返回
  • 移除无意义的循环转换逻辑
  • 修复语法错误(StudentDTOitem缺少空格)和不存在的方法调用(setUserName改为setStudentName)

修复后的Controller代码:

@GetMapping("/Student-count")
public ResponseEntity<List<StudentDTO>> getAllStudentCount() {
    List<StudentDTO> selectedCount = p2StudentService.getStudentCount();
    return ResponseEntity.ok(selectedCount);
}

4. 同步Service层方法调用

匹配Repository修改后的方法名:

public List<StudentDTO> getStudentCount() {
    return p2StudentRepository.getStudentCourseCount();
}

5. 检查数据库数据

若上述修改后仍返回空数组,确认数据库:

  • student表存在有效学生记录
  • courses表存在关联该学生的课程记录
  • student_id关联字段值完全匹配

内容的提问来源于stack exchange,提问作者AO SB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:15:36