2017-12-27 1 views
0

Ich versuche, dies zu tun:Wie konvertiert man die Ergebnisse einer @Query eines Repositorys richtig?

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

Dies führt mich zur Zeit eine Ausnahme eines Wandlers, so etwas wie dieses:

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] 

Ich denke, es also zu implementieren ein umgewandelt werden muss.

Wenn ich eine Liste zurückgibt funktioniert perfekt, aber ich gebe ein Objekt mit den Ergebnissen Feld als ein Array zurück.

Ich frage mich, was ist der beste Weg, um diese Umwandlung zu machen, um meine Abfrage zu behalten, ohne alles zu ändern?

+0

Nun, ich glaube, Sie könnte eine Liste von Studenten zurückgeben. Dann können Sie direkt die Schülerobjekte verwenden, anstatt ein benutzerdefiniertes Objekt mit einer Teilmenge von Feldern zu erstellen. Warum möchten Sie ein benutzerdefiniertes Objekt verwenden? – Teo

Antwort

0

In diesem Szenario müssen Sie eine benutzerdefinierte Schnittstelle erstellen, um das Ergebnis aus Ihrer Abfrage zu extrahieren. Nehmen wir an, Ihre Abfrage gibt student_id, class_id, student_name, student_class und so weiter zurück. Alles, was Sie brauchen, ist eine Schnittstelle wie erstellen unter

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

Dann Ihre Anfrage

@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); 

sein wird, die ich ausgewählt habe Spaltennamen für diese Art von benutzerdefinierten Abfrage angeben würde vorschlagen.

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

Sie können es einfach Karte Array Objekt:

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

in Service-Schicht, kann dies auf die Setter-Elemente von MyObject wie abgebildet werden:

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

.... 
} 
Verwandte Themen