ResultSet: vorheriges Element auslesen

azenth

Mitglied
Guten Tag Java Community,

ich schreibe an einem Programm, welches Werte aus einer Datenbank ausliest und diese in eine Liste schreibt.
Das Problem was ich an dieser Stelle habe ist, dass folgende Werte von der DB zurück geliefert werden, die ich dann nicht entsprechend weiter verarbeiten kann:

SELECT Statement:
Code:
SELECT DISTINCT h.host, t.tag FROM host h, host_tag ht, tag t
WHERE h.platform = 'linux' and h.hid = ht.hid and ht.tid = t.tid;

Folgende Werte werden dann zurück gegeben:

Code:
Server1   bla
Server1 blub
Server1 tschö
Server2 null
Server3 null
Server4 linux
Server4 blub
Server5 linux
Server6 null
Server7 null

Was ich nun erreichen möchte ist, dass jeder Server nur einmal in die Liste eingetragen wird und die Tags durch ein '|' Pipe getrennt die zu einem Server gehören auch.

Mein Code sieht momentan wie folgt aus:

Java:
				while(rset.next()) {
					if(ok) {
						if(rset.getString("tag") != null && ok) {
							tmpTag = tmpTag + rset.getString("tag") + "|";
							tmpHost = rset.getString("host");								
						} else {
							tmpTag = "";
						}
					} else {
						if(tmpHost.equals(rset.getString("host"))) {
							ok = true;
						} else {
							ok = false;
						}
						tmpHost = rset.getString("host");
					}

					if(ok) {
						hostList.add(new myList(rset.getString("host"), tmpTag));
					}
				}

Soweit so gut aber was in die Liste geschrieben wird sieht wie folgt aus:

Code:
Server1   bla
Server1 bla|blub
Server1 bla|blub|tschö
Server2 null
Server3 null
Server4 linux
Server4 linux|blub
Server5 linux
Server6 null
Server7 null

Ich sitze schon seit gestern dran und komme einfach nicht auf den Trichter was ich genau falsch mache.

Vielen Dank für alle Hinweise.

Gruß
Azenth
 
Zuletzt bearbeitet von einem Moderator:
Java:
if(ok) {
    if(rset.getString("tag") != null && ok) {

Beim 2.if kannst du dir das "&&ok" sparen 😉

Warum verwendest du keine Map<String, String>? Damit kannst du den Server als Key verwenden und die Tags sind dann die Values.
Und zu Beginn überprüfst du einfach ob für den Server schon ein KeyValuePair vorhanden ist. Wenn ja wird das erweitert, ansonsten ein neues eingefügt
 
Ich habe an eine Map nicht gedacht.

Mit der Liste geht das dann also nicht?

Ich habe daran gedacht, den vorherigen Wert aus rSet mit dem aktuellen Wert aus rSet zu vergleichen und darüber rauszufinden, ob der Host sich geändert hat und wenn ja soll das ganze in die Liste hinzugefügt werden.

Aber ich glaube es ist nicht möglich den aktuellen Wert mit dem vorherigen zu vergleichen oder?
 
Klar kannst du es auch mit einer Liste realisieren, aber die Map bietet sich hier doch bestens an.
Du willst für einen bestimmten Key (hier Server) deinen Wert (hier Tags) ändern/erweitern.

Nein den vorherigen Wert müsstest du in einer lokalen Variable zwischenspeichern.
 
Java:
SELECT DISTINCT h.host, t.tag FROM host h, host_tag ht, tag t
WHERE h.platform = 'linux' and h.hid = ht.hid and ht.tid = t.tid;

liest du hier aus 2 verschiedenen Tabellen? dann fehlt ein join, wenn nicht, dann sollte das FROM erst nach aufzählen aller Felder kommen oder?

gruß
 
Ja nur meine Liste, besteht hier noch aus weiteren Values, die ich in diesem Beispiel nicht angegeben habe.

Code:
hostList.add(new myList_sssss(rset.getString("host"), Integer.parseInt(rset.getString("id")), tmpTag, rset.getString("ip"), rset.getString("instance")));

All diese Werte bekomme ich von dem ResultSet aus der DB zurück. Kann ich in einer Map zu einem Key viele Values haben?

Gruß
 
Ja ich lese aus verschiedenen Tabellen.

Dies ist auch ein massiv vereinfachtes Beispiel:

Das Original Statement sieht wie folgt aus:

Code:
SELECT DISTINCT h.host, h.id, t.tag, h.ip, s.instance FROM host h LEFT OUTER JOIN host_tag ht ON h.host_id = ht.host_id LEFT OUTER JOIN tag t ON ht.tag_id = t.tag_id, satelliteserver s WHERE h.platform_id = '2' AND h.folder IS NULL AND h.id IN (11, 51) AND h.satelliteserver_id = s.satelliteserver_id AND EXISTS ( SELECT h1.fqhostname, h1.id FROM host h1, host_tag ht1 WHERE h1.host_id = ht1.host_id AND ht1.id IN (11,51) ) ORDER BY host

Wie gesagt es ist etwas komplexer.

Hintergrund ist, dass ich vorher alle diese Werte einzelnt abgefragt habe in meinem Skript, was eine sehr hohe Last auf der DB verursacht hat. Jetzt frage ich diese Werte in einem Statement ab. Aber ich habe nun das oben beschrieben Problem.

Gruß
Azenth
 
Mit der Liste geht das dann also nicht?
Mit einer Liste geht das, wenn du aus der Datenbank eine nach Hosts sortiere Liste bekommst.


Ich habe daran gedacht, den vorherigen Wert aus rSet mit dem aktuellen Wert aus rSet zu vergleichen und darüber rauszufinden, ob der Host sich geändert hat und wenn ja soll das ganze in die Liste hinzugefügt werden.

Aber ich glaube es ist nicht möglich den aktuellen Wert mit dem vorherigen zu vergleichen oder?

Auf den letzten rSet Wert kannst du nicht mehr zugreifen.
Du kannst dir aber 2 temporäre Variablen definieren.

String currentHost : Anfangs null und dann der gerade behandelte Host
String currentTag : Anfangs null und dann der String mit den Tags zu currentHost

Dann "sammelst" du alle Tags der ersten Hosts. Sobald du zum nächsten Host kommst, schreibst die dein bisheriges Zwischenergebnis in deine Result-Liste und machst den neuen Host zu deinem currentHost. Gleichzeitig setzt du currentTag wieder auf null.

Nach der while Schleife musst du noch den zuletzt bearbeiteten Host in die Ergebnisliste schreiben.

Das würde dann so aussehen:
Java:
    String currentHost = null;
    String currentTag = null;

    while(rset.next()) {
        String tmpHost = rset.getString("host");
        String tmpTag = rset.getString("tag");

        if ( currentHost.equals ( tmpHost ) ) {
            if ( currentTag == null ) {
                currentTag = tmpTag;
            } else {
                currentTag = currentTag + "|" + tmpTag;
            }
        } else {
            if ( currentHost != null ) {
                hostList.add(new myList(currentHost, currentTag));
            }
            currentHost = tmpHost;
            currentTag = tmpTag;
        }
    }
    if ( currentHost != null ) {
      hostList.add(new myList(currentHost, currentTag));
    }
 
Zuletzt bearbeitet:

Zurück
Oben