# JDBC Tabellen ausgeben



## Heratis23 (19. Jun 2021)

Moin, 
ich versuche gerade eine Ausgabe aus meiner Datenbank zu erzeugen.
Es gibt folgende Tabelle:
Kinokette(NameKinokette, AnzahlMitarbeiter, Stadt)

Für eine Kinokette gibt es mehrere Einträge, je nachdem in wie vielen Städten die Kino-Kette ansässig ist.
Also z.B. 
Cinemaxx, 2000, Hamburg
Cinemaxx, 2000, Berlin
.....

Ich möchte jetzt eine Ausgabe die wie folgt aussieht:
Cinemaxx, 2000, Hamburg, Berlin, .....
Also alle Städte in einer Zeile statt x Zeilen mit jeweils redundaten Infos.

Wie bekomme ich das alles in eine Zeile??
Danke im Voraus


----------



## Dukel (19. Jun 2021)

String_Agg() sollte es in bei unterschiedlichen Datenbanken geben.


----------



## Heratis23 (19. Jun 2021)

Dukel hat gesagt.:


> String_Agg() sollte es in bei unterschiedlichen Datenbanken geben.


Super, hat geklappt, danke dir.
Ich wollte jetzt noch zu jeder Kinokette 5 Filme ausgeben, die aktuell in dem Kino laufen.
Wenn es weniger als 5 Filme gibt dann halt nur die, die da sind, wenn es mehr sind die ersten 5 nach alphabetischer Reihenfolge.
Ich habe mir zwei result-sets gebaut, bei welchem erst über die Filme mit einer Schleife gegangen wird und anschließend mit dem aktuellen NameKinokette über eine zweite Tabelle wo die Filme je KinoKette gespeichert sind. 
Allerdings bekomme ich die ganze Zeit den Fehler "ResultSet" geschlossen, sobald ich mit der ersten Iteration durch bin und er versucht rs.next() aufzurufen um das nächste Kino auszugeben.
Kann ich keine verschachtelten Schleifen mit gleichzeitig offenen Verbindungen zur DB machen? bzw. gibt es dafür eine Alternative?


----------



## Dukel (19. Jun 2021)

Kann man dies nicht mit einer entsprechenden SQL Abfrage lösen? Sprich Filme und Kinos joinen.


----------



## kneitzel (19. Jun 2021)

Also wie schon von @Dukel geschrieben könnte man dies direkt in SQL lösen.

Wenn man dies nicht in SQL sondern in Java lösen möchte, dann solltest Du zwei Dinge prüfen:
a) kann dein JDBC Treiber nested statements?
b) Das Flag HOLD_CURSORS_OVER_COMMIT könnte notwendig sein.
Paar Informationen mehr finden sich z.B. unter: https://stackoverflow.com/questions/935511/how-can-i-avoid-resultset-is-closed-exception-in-java

Generell könnte man aber auch eine weitere Connection öffnen. 

Bewertung dieser Optionen ist aber: erste ist schlecht und zweite ist noch schlechter  Du hast eine Datenbank und die sollte man vernünftig abfragen


----------



## Barista (19. Jun 2021)

Heratis23 hat gesagt.:


> Kann ich keine verschachtelten Schleifen mit gleichzeitig offenen Verbindungen zur DB machen? bzw. gibt es dafür eine Alternative?


Join einfach alles in SQL zusammen und fummele es in Java auseinander.
Wenn Du zum Funktionieren Deines Codes sortierte Daten benötigst, dann hilft Dir SQL's "ORDER BY".
Alternativ eine Map benutzen und anhand Schlüssel-Gleichheit die Filme sammeln.
Ein Tuple-Klasse mit hashCode und equals solltest Du hinbekommen (gibt es nach meinem Wissen derzeit nicht im JDK).


----------



## Heratis23 (19. Jun 2021)

Dukel hat gesagt.:


> Kann man dies nicht mit einer entsprechenden SQL Abfrage lösen? Sprich Filme und Kinos joinen.


Hm, ja, joinen kann ich das natürlich..
Aber dann wird bei mir bei jedem Aufruf
Cinemax, 2000, Berlin,.... Film1
Cinemax, 2000, Berlin,.... Film2
ausgegeben..
Ich brauche aber 
Cinemaxx, 2000, Berlin, ...
Film1
Film2


----------



## Barista (19. Jun 2021)

Heratis23 hat gesagt.:


> Cinemax, 2000, Berlin,.... Film1
> Cinemax, 2000, Berlin,.... Film2
> ausgegeben..
> Ich brauche aber
> ...


Mach eine Map.

Der Schlüssel ist Cinemax, 2000, Berlin, also NameKinokette, AnzahlMitarbeiter, Stadt.

Der Wert ist eine Liste, neu Anlegen wenn nicht vorhanden in eigenem Code oder mit _computeIfAbsent_ anlegen.

Film an Liste anhängen.

Wenn nur die ersten 5 Filme, dann fragen, wie lang die Liste ist und bedingt anhängen, dafür gibt es if, schaffst Du schon (vielleicht).


----------



## Heratis23 (19. Jun 2021)

Barista hat gesagt.:


> Mach eine Map.
> 
> Der Schlüssel ist Cinemax, 2000, Berlin, also NameKinokette, AnzahlMitarbeiter, Stadt.
> 
> ...


okay danke^^ ich probiere mal rum


----------

