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());
我正在尝试从 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());