2017-02-03 4 views
2

Jede Zeile in meinem DB wie dieseRowMapper Mit zurückzukehren Map <String, Map <String, List <Object> >>

School Class StudentID Name Age 
123  8  811  John 10 
123  8  812  Smith 11 
123  8  821  John 12 
123  8  822  Smith 13 
123  9  911  John 14 
123  9  912  Smith 15 
456  8  811  John 10 
456  8  812  Smith 11 

Jetzt möchte sein wird ich die obigen Daten wie diese

zurückzukehren
Map<String,Map<String,List<Object>>> 

ie. Map<School,Map<Class,List<StudentID>>> 

Ich benutze Spring JdbcTemplate mit einer RowMapper aber alles was ich bekommen kann ist eine Liste aller Zeilen. Da ich meine Hauptkarte in meinem RowMapper nicht beibehalten kann (kann ich eine statische Karte in der RowMapper-Klasse haben ?? aber ich möchte nicht, dass es statisch ist, da dies ein Webservice ist und nachfolgende Aufrufe möglicherweise geschraubt werden.) Ich habe nur die Option, diese Zeilenliste zu bekommen und dann meine Logik zu haben, um die Sammlung zu erstellen, die ich möchte.

Ich habe über ResultSetExtractor kennengelernt, aber ich konnte nicht finden, wie man das damit macht.

Bitte lassen Sie mich wissen, wenn es irgendeinen Weg gibt, den ich mit einem Zeilenmapper oder einer anderen Art erledigen kann. Oder mein einziger Weg, dies zu lösen, ist, dass ich die Liste wiederholen muss und bekomme, was ich will.

EDIT: Meine Abfrage ist eine Auswahlabfrage wie folgt aus:

SELECT * from TABLENAME 

und es dauert eigentlich 40 Minuten die ResultSet von Java abzurufen.

Da der DB-Aufruf das Cache-Objekt füllen soll, was mit CRON alle 4 Stunden gemacht wird, ist es mir egal, die Zeitverzögerung von 40 Minuten seit den eigentlichen REST-Aufrufen bezieht sich auf das Cache-Objekt. Trotzdem möchte ich das so effizient wie möglich machen.

Bitte lassen Sie mich auch wissen, wenn es andere Möglichkeiten gibt, mit diesem Szenario umzugehen. Ein normaler jdbc-Aufruf für jeden REST-Aufruf ist teuer, da wir 100 Anfragen pro Sekunde erhalten.

+0

Ich nehme an, Sie für jede Ihrer Einheiten eine 'DAO' Klasse haben? Warum lassen Sie nicht Ihre DAO die Transformation der "Liste" zur "Map" machen und sie an die Außenwelt zurückgeben? – CKing

+0

Der jdbcTemplate-Aufruf befindet sich im DAO. Ich möchte wissen, ob dies mit RowMapper erledigt werden kann. – v1shnu

+0

Also wollen Sie grundsätzlich die 'JdbcTemplate' die' Map' für Sie bilden, wenn Sie eine Abfrage damit ausführen? Ich glaube, jede Lösung, die du implementierst, würde schließlich nur eine 'Liste' in eine' Map' verwandeln, also warum nicht deine 'DAO' das machen lassen? – CKing

Antwort

1

RowMapper

Sie könnten ein staatlich voll RowMapper implementieren, die Ihr Problem löst, aber es ist nicht wirklich mit der Idee des RowMapper entsprechen die vermutlich staatenlos und wiederverwendbar wie angegeben in der JavaDoc sein:

... sind RowMapper Objekte typischerweise staatenlos und somit wiederverwendbar ...

Die RowMapper ist wird für die Umwandlung von Zeile in Objekt verwendet, was bedeutet, dass jede Zeile ResultSet ein eigenes Objekt erhält.

ResultSetExtractor

Es ist wirklich die ResultSetExtractor, die Ihrer Aufgabe passt. Die ResultSetExtractor wird für ResultSet zur Objektkonvertierung gemacht, wie Sie beabsichtigen zu tun.

implementieren Sie einfach die Karte dort Füllung durch Iterieren der ResultSet und eine Instanz der ResultSetExtractor Implementierung zu Ihrem JdbcTemplate.query(...) Aufruf übergeben.


-Update 2017-02-09

Während der Kommentar folgt, ein Beispiel ResultSetExtractor mit nützlich wäre, stieß ich auf die RowCallbackHandler Schnittstelle. Während beide Optionen ermöglichen, das gewünschte Verhalten zu realisieren, behandelt die RowCallbackHandler die ResultSet Iteration für Sie. Es kann auch über JdbcTemplate.query(...) Anruf verwendet werden.

Beispiele für beide RowCallbackHandler und ResultSetExtractor ich den folgenden Artikel Ram Satish empfehlen: http://www.javarticles.com//2015/02/example-of-spring-callbacks-used-in-jdbctemplate.html

+0

Danke. Aber baut gerade meine aktuelle Karte, nachdem ich den jdbc-Aufruf effizient gemacht habe? (leistungsmäßig.) Die Abfrage "SELECT * from TABLE", die ich verwende, dauert tatsächlich 40 Minuten, um abgeschlossen zu werden. Und wenn ich die Map erneut erstellen möchte, müsste ich erneut über das ResultSet iterieren. Und deshalb dachte dieser Ansatz in der Leistung helfen. – v1shnu

+1

Ich habe heute den ResultSetExtractor ausprobiert und konnte tun, was ich vorhatte. Können Sie bitte ein kleines Implementierungs-Snippet hinzufügen, wie der ResultSetExtractor funktioniert, damit die Antwort für andere nützlicher ist? – v1shnu

Verwandte Themen