"Komplexe" Datenbankabfragen, welches ist der bessere Weg

pl4gu33

Top Contributor
Hey,... ich bin gerade dabei meine Persistenzschicht(Hibernate) fertigzustellen und stehe nun vor folgendem Problem

ich hab eine 2 Tabellen, welche Bidirektional 1:N verknüpft sind,....
Meine Entities sehen wie folgt dazu aus:

Tabelle 1:
PK
KundeID
FirmenID

OneToMany...
List<Tabelle2>

Tabelle 2:
PK
Datum

ManyToOne...
Tabelle1

KundeID/FirmenID können in beliebiger Kombination stehen, daher kann eins der beiden öfter vorkommen etc.

Leider sind überall immer nur triviale Anfragemöglichkeiten aufgelistet, daher möchte ich zu folgender Anfrage wissen, was sich eher lohnt bzw. besser ist (auch rein lerntechnisch gesehen 😉)

Die Anfrage: Gib mir alle Tabelle 2 Datensätze mit dem Datum XY, die zu dem Kunden Z gehören.

Lösung A:
Ich mach eine Abfrage auf Tabelle 1 und hole mir damit alle PKs, wo der User vorkommt und gehe damit auf Tabelle 2 und hole mir alle Datensätze, wo die PKs, die ich brauche vorkommen. (Also alle Anfragen auf die DB bezogen)

Lösung B:
Ich hol mir eine Anfrage auf Tabelle1 und habe somit auch direkt die Liste, dann laufe ich mit einer Schleife über die List und sortiere auf "JAVA"- Ebene aus. (das wären dann doch weniger DB Zugriffe, die wohl mehr "kosten" als eine Sortierung auf JAVA- Ebene oder sehe ich das falsch?

Danke schon mal für eure Antworten 😀

ps. ich hoffe, ich werde jetzt nicht gelyncht,... 😀
 
Zuletzt bearbeitet:
Ich kann nicht mehr editieren, darum nen Doppelpost:

Also Beispiel B fühlt sich irgendwie falsch an .... würde sich aber doch bei OR-Mapping anbieten, daher stelle ich meine Frage mal anders .... Wäre B ein falscher Ansatz und sollte man sowas wirklich nur mit DB- Anfragen umsetzen oder wäre es eine mögliche Alternative?
 
Du schreibst zwar, dass Du Hibernate benutzt, beschreibst aber nur die Datenbank. Deswegen antworte ich Dir mal für den Bereich. Weder A noch B.
Gib mir alle Tabelle 2 Datensätze
SQL:
SELECT (die,ganzen,felder) FROM Tabelle2 AS t2
, die zu dem Kunden Z gehören.
SQL:
INNER JOIN Tabelle1 As t1
ON t1.KundeId = t2.PK
mit dem Datum XY, [...] Kunden Z
SQL:
WHERE t2.Datum = '<Datum>'
AND t2.PK = '<Kunde Z>'
So in etwa. Kann natürlich sein, dass die Query nix zurück gibt, wenn entweder das Datum für keine Eintrag in Tabelle2 stimmt oder, wenn zum "Kunde Z" keine Tabelle2-Einträge zugeordnet sind.

So einen JOIN kann man auch mit JPQL, HQL oder dem Criteria-API schreiben. Vorausgesetzt, das Mapping der Entities stimmt, hat man da die freie Auswahl.
 
Zuletzt bearbeitet von einem Moderator:
okay vll. nochmal zum Verständnis,... das oben sollte eigentl. grob die Hibernate/JPA Struktur darstellen okay war vll. etwas verwirrend, weil ich die Tabelle genannt habe 😀

das was du beschreibst, wäre ja Lösung1 😀
dass ich alles per Abfragen regel.

Lösung 2 sollte eigentl. nur wiederspiegeln, dass ich mir alle Objekt nehme, die den User beinhalten und sie auf JAVA Ebene selber sortiere,...

also:
"Querry qry = "gib mir alle Objekte Tabelle1, wo User = Z;"
und dann habe ich ja alle meine Tabelle1 Objekte wo User = Z. Und jetzt manch ich halt keine JOIN Abfrage oder sowas, sondern iteriere selber die Liste der Objekte durch und schau in jedem Objekt, ob die List<Tabelle2> das Datum enthält.

So würde ich mir halt die Anfrage sozusagen auf JAVA Basis durchführen. Die Frage ist halt, ob das wirklich sinnvoll ist, weil irgendwie fühlt es sich falsch an außerdem müsste ich prüfen, ob die Daten "Null" sind, dass ich beim Vergleich keine NullPointerException oder ähnliches bekomme... was bei einer SQL Anfrage total egal wäre.... vll. mach ich mir da auch gerade unnötig Gedanken, weil wozu gibt es denn Joins 😀
 
Zuletzt bearbeitet:
okay das Thema hat sich erledigt 😀

Lösung 2 is verworfen, da sie einfach nicht rentabel ist und ich die Abfrage über die DB einfacher hinbekomme, als alles selber zu machen (was wohl auch nicht Sinn der Sache ist!)😀

Mein Denkfehler war, dass ich zu sehr an eine relationale DB gedacht habe .... aber durch die Hibernate/JPA Beziehung kann ich ja mehr in Objekten denken und da eh alles für mich mitgeladen wird (zumindest Default in JPA, in Hibernate nicht 🙂, kann ich direkt über die "Objekt"- Referenz einfach den "JOIN" vollziehen und muss auch nix extra laden....

nun klappts auch, wie ich das wollte 😀
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben