2017-12-27 12 views
0

나는이 작업을 수행하려고 :저장소의 @Query에서 결과를 올바르게 변환하는 방법은 무엇입니까?

@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를 반환합니다.

모든 것을 수정하지 않고도 내 쿼리를 계속 사용하려면이 변환을 수행하는 가장 좋은 방법은 무엇입니까?

+0

글쎄, 난 당신을 생각 :

서비스 계층에서
**List<Object[]>** findByStudentId(@Param("studentId") long studentId); 

이는 등을 MyObject의 세터 요소에 매핑 할 수 있습니다 학생들의 목록을 반환 할 수 있습니다. 그런 다음 필드의 하위 집합으로 맞춤 개체를 만드는 대신 학생 개체를 직접 사용할 수 있습니다. 왜 맞춤 개체를 사용하고 싶습니까? – Teo

답변

0

이 시나리오에서는 쿼리 결과를 추출 할 사용자 지정 인터페이스를 만들어야합니다. 귀하의 쿼리가 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); 

나는 사용자 지정 쿼리 이런 종류의 선택 열 이름을 지정 제안 할 것이다 이하와 같은 인터페이스를 만드는 것입니다.

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[]> 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()); 

.... 
}