org.springframework.core.convert.ConversionFailedException: 类型转换失败

org.springframework.core.convert.ConversionFailedException: Failed to convert from type

我正在尝试从 StudentRepository 中的 table 获取数据:

 @Query("SELECT S.studentId, S.studentName, S.studentSurname, S.studentAge, S.entryYear," +
        "S.graduateYear, S.facultyName, G.groupName FROM Student S LEFT JOIN Group G ON G.groupId=G.groupId ORDER BY S.studentId")
    List<StudentDTO> getAllStudentDtos();

当我启动程序并尝试从控制器获取此数据时:

  @GetMapping("students")
public String showStudents(Model model) {
    List<StudentDTO> students = studentService.getAllStudentDtos();
    model.addAttribute("students", students);
    return "studentViews/studentsPage";
} 

我收到这个错误。

此处全部例外:

org.springframework.core.convert.ConversionFailedException: Failed to convert from type
[java.lang.Object[]] to type [@org.springframework.data.jpa.repository.Query
com.foxminded.university.dto.StudentDTO] for value '{1, Alexandr, Platonchik, 37, 1999, 2004, journalism, BIKS}'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.Integer] to type [@org.springframework.data.jpa.repository.Query com.foxminded.university.dto.StudentDTO]

发生此错误是因为存储库中的方法 getAllStudentDtos return 是 Student 的列表,而不是您所想的 List<StudentDTO>。 Spring 存储库绑定到 @Entity,在您的情况下 Student,因此当您将方法 return 用作 List<Student> 时会出现问题。

您的问题有两种可能的解决方案。第一个是在你的 StudentDTO class 中声明一个构造函数,其中包含你想要用于查询的确切字段参数,并在你的 getAllStudentDtos.

中使用它

例如:

public StudentDTO(Long studentId, String studentName) {
    this.studentId = studentId;
    this.studentName = studentName;
}

...

@Query("SELECT new StudentDTO(S.studentId, S.studentName) FROM Student S LEFT JOIN Group G ON G.groupId=G.groupId ORDER BY S.studentId")
List<StudentDTO> getAllStudentDtos();

请注意,我在示例中只使用了两个字段。

或者您可以在 StudentDTO 中实现一个方法,将 Student 实体转换为 StudentDTO,然后使用您的方法映射列表。

例如:

List<StudentDTO> students = studentService.getAllStudentDtos().stream().map(student -> StudentDTO.toDto(student)).collect(Collectors.toList());