2017-02-09 7 views
0

Ich möchte mehrere Zeilen in ein einzelnes Objekt zuordnen. Hier ist meine resultSetWie man mehrere Zeilen in einem einzelnen Objekt abbildet?

Id  Name  Marks 
1  A   34 
2  b   35 

Meine Klasse ist so etwas wie

pubic class student{ 
int id; 
String name; 
List <Integer> marks; 
} 

ich mit RowMapper versucht, aber das ist für 1: 1-Beziehung b/w Reihe und Objekt. Bitte schlagen Sie mir den richtigen Ansatz vor, um dies zu erreichen?

Vielen Dank im Voraus

+0

Im Beispiel jede Zeile einen anderen 'Id' hat und' Name', noch Ihre 'student' Klasse (die ** S ** tudent sein soll), hat ein einzelnes 'id' und 'name' Attribut. Wie können mehrere Zeilen in einen einzelnen "Student" passen? –

+0

das war nur ein Beispiel tatsächlich kann es die gleichen Ids und Namen geben. @AndrewS –

Antwort

1

Nico Van Belle's approachResultSetExtractor verwendet, ist ein Weg zu gehen, es sei denn Sie Collection<Student> anstelle eines einzelnen Student Objekt zurückkehren würde.

Bei der Implementierung von ResultSetExtractor<T> gibt Spring das vollständige ResultSet (alle zurückgegebenen Zeilen aus der DB) zurück. Es liegt in Ihrer Verantwortung (und Freiheit), die Logik zu implementieren, wie die Daten/Objekte extrahiert werden, die Sie als (vollständiges) Ergebnis zurückgeben möchten. Und das Ergebnis ist ein einzelnes Objekt, z.B. Set oder List (von Student-Objekten).

ist hier ein grobes Beispiel:

new ResultSetExtractor<Collection<Student>>() { 
    @Override 
    public Collection<Student> extractData(ResultSet rs) throws SQLException, DataAccessException { 
     Map<Integer, Student> studentMap = new HashMap<>(); 

     while(rs.next()){ 
      Integer id = rs.getInt(0); 
      Student student = studentMap.get(id); 

      if (student == null) { 
       String name = rs.getString(1); 
       student = new Student(id, name); // additional constructor for Student class 
       studentMap.put(id, student); 
      } 

      student.addMark(rs.getInt(3)); 
     } 

     return studentMap.values(); 
    } 
}); 
0

In dem Fall, dass all 1 Zeile führt zu einem Objekt nicht, können Sie das ResultSetExtractor verwenden können. Ihre endgültige Lösung sollte diesem grob gemachte Beispiel ähneln;

new ResultSetExtractor<Student>() { 
    @Override 
    public Student extractData(ResultSet rs) throws SQLException, DataAccessException { 
     Student student = new Student(); 
     while(rs.next()){ 
      // internal logic where you set id, name and add marks to the list 
      student.addMark(rs.getInt(3)); 
     } 
     return student; 
    } 
}); 
+0

ID Name Marks 1 A 34 2 b 35 –

+0

ich meine ResultSetExtractor wie neue ResultSetExtractor sein wollen () { @Override public List extractData (ResultSet rs) wirft SQLException, DataAccessException { Liste student = neue ArrayList ; while (rs.next()) { // interne Logik, in der Sie die ID setzen, benennen und der Liste hinzufügen \t \t Student s = new Student(); s.setId (rs.getInteger ("id")); s.setName (rs.getString ("name")); \t s.setmarks (neue ArrayList () .add (rs.getmarks ("marks"))); \t } Rückkehr Student; } }); –

+0

Wenn ich jedes Mal mit Ihrem Ansatz gehe, muss ich mit studentId in der Liste suchen und die Markierungsliste mit den neuen erhaltenen Markierungen im aktuellen rs aktualisieren. Das sieht mir nicht gut. Gibt es noch etwas, dem ich folgen kann? @ Nico Van Belle –

Verwandte Themen