如何正确转换存储库的@Query结果?

时间:2017-12-27 21:57:29

标签: java spring

我正在尝试这样做:

@Query(value = "SELECT * from student, class where student.class = class.id ..(and more)", nativeQuery= true)
    List<MyObject> findByStudentId(@Param("studentId") long studentId);

目前这引起了一个转换器的例外,如下所示:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.Integer] to type [com.project.model.MyObject]
    at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:324) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]

所以我想必须转换为实现。

当我返回一个List工作完美但我返回一个Object,字段结果为数组。

我想知道什么是使这种转换继续使用我的查询而不必修改所有内容的最佳方法?

2 个答案:

答案 0 :(得分:1)

在这种情况下,您必须创建自定义界面以从查询中提取结果。假设您的查询返回student_id,class_id,student_name,student_class等。您所需要的只是创建一个如下所示的界面

  interface MyCustomObject{
        Long getStudentId();
        Long getClassId();      
        String getStudentName();
        String getStudentClass();            
    }

然后您的查询将是

@Query(value = "SELECT s.student_id, c.class_id, s.student_name, s.student_class from student s, class c where student.class = class.id ..(and more)", nativeQuery= true)
    List<MyCustomObject> findByStudentId(@Param("studentId") long studentId);

我建议为这种自定义查询指定选定的列名。

答案 1 :(得分:0)

@Query(value = "SELECT * from student, class where student.class = class.id ..(and more)", nativeQuery= true)
    List<MyObject> findByStudentId(@Param("studentId") long studentId);

你可以简单地将它映射到对象数组:

**List<Object[]>** findByStudentId(@Param("studentId") long studentId);

在服务层中,可以将其映射到MyObject的setter元素:

List<Object[]> listitems=repository.findByStudentId(long studentid);
for(Object obj:listitems){
MyObject myobj=new MyObject();
System.out.println(obj[1].toString());  myobj.setid(obj[1].toString());
System.out.println(obj[2].toString());

....
}