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
相关产品推荐
相关产品推荐

