JPA Liste mit mehreren Entitäten

internet

Top Contributor
Hallo zusammen,

für eine "Geburtstagsuche" möchte ich gerne eine List ausgeben, die mir die Geburtstage von Mitarbeiter und Kunden ausgibt.

Also vereinfacht erst mal alle Kunden und alle Mitarbeiter.

Java:
SELECT e,c FROM Employee e, Customer c

Nun ist mein Problem in welchem Datentyp ich das Ganze in einer Liste speichere.
Mein Ansatz ist nun das ganze in eine List<Object> list zu speichern.

Das Problem ist nun jedoch, dass ich dann ja bspw. im Feld[0] des Arrays sowohl der Customer, als der Employee gespeichert bekomme. Allerdings sollen es ja zwei Felder sein.

Generel ist es natürlich möglich eine Liste vom Typ Date List<Date> zu erstellen, macht für mich aber kein Sinn, da ich später zudem auch einen Link auf den Employee und Customer in der HTML-Seite hinzufügen möchte-> geht also nicht.

Gibt es hierbei irgendwelche Lösungsansätze?


Mein derzeitger Lösungsansatz ist:
Zwei Query mache:
1.) Eine Query, das mir die Geb. der Customer liefert
2.) Eine Query, das mir die Geb. der Employee liefert.

Beide Ergebnismengen "verheirate" ich wiederum in eine dritte Liste, welche von einem Typ "CustomClass" ist. CustomClass hat zwei Attribute
a) Customer b) Employee
=> Die Customer aus der ersten Query befülle ich dann eben in die dritte Liste mit dem Attribut Customer, und das gleiche für die Employees.

Okay, funktioniert auch - aber ich denke professionell und schön ist das nicht???
WARUM?
Beispiel: Ich möchte mir die nächsten 100 Geburtstage von Employee und Customer ansehen.
Insgesamt sind über 100 Employees und über 100 Customer in der DB .
Zunächst holt er alle 100 Geb der Customer. Dann die 100 Geb. der Employee => Macht also schon Mal 200 Geburtstag (ich möchte aber nur 100 anzeigen!!!)

Nun muss ich nochmals eine Sortierung vornehmen, die dann wirklich nur die kommenden Geb. in die dritte Liste speichert.
Ich denke das könnte ein "Performance-Killer" werden.

Kann mir hierfür bitte jemand Tipps geben, wie ich das anderst lösen kann?

Vielen Dank für Eure Hilfen...
 

turtle

Top Contributor
Ich habs nicht ganz verstanden:oops:

Stehen Employee und Customer in einer Beziehung?

Dann kann man einen Join nutzen und Einträge aus beiden (oder mehreren) Tabellen referenzieren und muss die Beziehungen angeben.

Nehmen wir an, das jeder Employee "seinen" bestimmten Customer gehört.

Dann sollte es so gehen:

SELECT e,c FROM Employee e, Customer c WHERE e.customerid=c.id and e.birthdate BETWEEN :date1 AND :date2
 
Zuletzt bearbeitet:

internet

Top Contributor
Danke für Deine Antwort.

Employee und Customer stehen in einer Beziehung.
Dies geschieht über die Entität "Mandanten". Ich wollte diese Entität bei der Frage aber bewusst weglassen, da es vermutlich verwirrt hätte.

Das eigentliche Problem ist ja, dass ich zwei unterschiedlich Entitäten bei Deiner Query bekomme (Employee und Customer).
Also bei SELECT e,c

Nun möchte ich ja aber eine Liste, in der die Ergebnisse (also entweder Employee ODER Customer) gespeichert werden.
Mein Problem ist jetzt aber: Welchen Datentyp muss diese Liste haben?

Code:
List<????> meineListe = new ArrayList<????>();
 

Deros

Bekanntes Mitglied
spontan würde ich wohl sowas machen:

select 'Employee' Typ, e.id Id, e.birthdate gebDatum from Employee e
union
select 'Customer ' Typ, c.id Id, c.birthdate gebDatum from Customer c
where
e.birthdate BETWEEN :date1 AND :date2
and
c.birthdate BETWEEN :date1 AND :date2
 

Deros

Bekanntes Mitglied
sowas müsste schon funktionieren


Java:
TypedQuery<Object[]> query = em.createQuery(
"select 'Employee' Typ, e.id Id, e.birthdate gebDatum from Employee e
union
select 'Customer ' Typ, c.id Id, c.birthdate gebDatum from Customer c
where
e.birthdate BETWEEN :date1 AND :date2
and
c.birthdate BETWEEN :date1 AND :date2 ", Object[].class);
 List<Object[]> results = query.getResultList();
 

Deros

Bekanntes Mitglied
und eine Fehlermeldung willst uns nicht verraten?
so wie die Querry da steht funktioniert sie natürlich nicht, der String muss natürlich konkateniert werden und date1 und date2 jeweils befüllt.
 

internet

Top Contributor
Fehlermeldung ist, dass das SQL-Statement nicht richtig ist bzw. ein Fehler drin ist.
Ich habe es mal nun versucht ohne Date - Bedingung, da ich das mit "Typ" noch nie gemacht habe.
Hier meine Query:

"select 'Employee' Typ, e from Employee e union select 'Customer ' Typ, c from Customer c",

Kannst Du mir sagen, was ich falsch mache bzw. wie die Query richtig heißen müsste?
 

Deros

Bekanntes Mitglied
du musst die einzelnen Spalten angeben also was in der richtung:

SQL:
"select 'Employee' Typ, e.geburtstag, e.name from Employee e union select 'Customer ' Typ, c.geburtstag, c.name from Customer c",
 

Deros

Bekanntes Mitglied
hast doch festgestellt das ne Fehlermeldung kommt also was willst du jetzt von mir hören?
Ist jetzt doch kein akt die spaltennamen anzugeben oder?
 

internet

Top Contributor
naja, wenn du einen Kunden hast, der etliche Informationen hat (sagen wir mal 20 Attribute) ist das schon nervig, die alle mit anzugeben...
 

Deros

Bekanntes Mitglied
ich denke es geht um eine Geburtstagssuche? wofür brauchst du da weitere 20 Spalten?

wenn man dir irgendwie mit der Fehlermeldung helfen können soll, musst du schon die gesamte Fehlermeldung posten und den Code dazu am Besten auch.
 

internet

Top Contributor
Der Fehler tritt bei folgender Query auf:

Java:
select 'Employee' Typ, e.geburtstag, e.name from Employee e union select 'Customer ' Typ, c.geburtstag, c.name from Customer c

Irgendwas stimmt wohl mit dem "Typ" nicht zu stimmen.
Lassen wir das mit dem Geburtstag mal ausen vor:

Ich möchte im Grunde genommen alle Employee und Customer ausgeben, die zu einem Mandatory gehören:
Im Prinzip baue ich mir zwei Querys:

select e from Employee e where e.mandatory.id = 1

select c from Customer c where c.mandatory.id = 1

Das funktioniert ja nun auch alles wunderbar. Nun möchte ich aber die Ergebnisse dieser zwei Listen in EINE Liste zusammenfassen.
Ich habe das über einen UNION funktioniert - dann bekomme ich aber nur einen Eintrag mit dem Employee und dem Customer.
Ich möchte aber wenn ich 1 Customer und 1 Employee habe, auch zwei Einträge herausbekommen.

Wie mache ich das am Besten?
 

Deros

Bekanntes Mitglied
Was für eine DB nutzt du denn?

SQL:
select 'Employee' as Typ, e.geburtstag, e.name from Employee e union select 'Customer ' as Typ, c.geburtstag, c.name from Customer c

kannste mal probieren, ansonsten kannst die Spalte auch weglassen, sollte nur zum unterscheiden von customer und employee sein. Ansonsten wäre die komplette Fehlermeldung noch immer wünschenswert
 

internet

Top Contributor
so, die Query geht nun OHNE Fehler.
Allerdings bekomme ich immer nur den Employee heraus. Also sprich der UNION funktioniert nicht?

Was muss ich hierzu noch machen?
 

Deros

Bekanntes Mitglied
Junge ich gebe es auf...Der UNION funktioniert mit Sicherheit, wenn du ihn richtig nutzt, aber man muss dir ja ständig aus der Nase ziehen, was du gerade machst. Wie sieht das Statement aus? Was für einer DB nutzt du? Wie sieht dein restlicher Code aus? mal das Statement direkt auf die DB losgelassen ausserhalb von JAVA? ;(
 

internet

Top Contributor
Die Query sieht so aus:

Code:
SELECT 'Employee' AS Typ, e.geburtstag, e.name FROM Employee e UNION SELECT 'Customer ' AS Typ, c.geburtstag, c.name FROM Customer c

- Als DB nutze ich MySQL
- Das Ganze eben mit JPA / Hibernate

Restlicher Code habe ich nicht - ich möchte erst mal die Query zum Laufen bekommen...
 

Deros

Bekanntes Mitglied
Hast du die Querry im MySQL-Workbench laufen lassen? wenn nein gibt es mit Sicherheit mehr Code, vielleicht läufst ja einfach falsch durch die Liste, so ist alles blödes raten und da habe ich echt keinen bock drauf...:eek:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
nikgo Java SQL Ausgabe in Liste o.ä. abspeichern um mit dem Ergbnis "zu arbeiten"? Datenbankprogrammierung 5
C Hibernate Liste mit allen Objekten einer Entity Datenbankprogrammierung 17
E Hibernate: Sortierte Liste Persistieren Datenbankprogrammierung 3
N Sortierte Liste in Datenbank speichern? Datenbankprogrammierung 3
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
S Als Rückgebewert eine Liste von Werten? Datenbankprogrammierung 3
sparrow [Hibernate] Die Liste einer Verknüpfung selber setzen Datenbankprogrammierung 2
K Hibernate: Liste von String-Werten Datenbankprogrammierung 2
P MYSQL werte aus liste auslesen und anderen damit updaten Datenbankprogrammierung 4
J Zahlungseingänge von mehreren Kunden wie am besten abbilden in der Datenbank ? Datenbankprogrammierung 8
E SQLite Datenbank durchsuchen mit mehreren Suchbegriffen Datenbankprogrammierung 10
S MySQL Befüllen von mehreren Spalten Datenbankprogrammierung 1
R Transaktionen von mehreren Anwendungen aus - JDBC Datenbankprogrammierung 3
M Problem mit mehreren Datasourcen Datenbankprogrammierung 3
D Oracle Funktion mit mehreren Out Parametern ausführen? Datenbankprogrammierung 3
L MySQL Datenbank beschreiben mit mehreren Threads Datenbankprogrammierung 18
0 Filtern nach mehreren Kriterien Datenbankprogrammierung 4
S Embedded DB, die aus mehreren JVMs gestartet werden kann? Datenbankprogrammierung 10
H Group By mit mehreren Spalten Datenbankprogrammierung 2
S Verständnisproblem mit mehreren DAOs Datenbankprogrammierung 7
S Verkettung von Spalteninhalten aus mehreren Zeilen Datenbankprogrammierung 10
D aus mehreren sql tabellen matchen und sortieren Datenbankprogrammierung 6
P [Hibernate] Zwischentabelle mit mehreren Feldern Datenbankprogrammierung 7
C Hibernate-Mapping bei mehreren FK´s auf die selbe Tabelle Datenbankprogrammierung 12
J JDBC mit mehreren Threads. Datenbankprogrammierung 8
T [jdbc] einen Eintrag aus mehreren Tabellen löschen (Batch) Datenbankprogrammierung 3
claireannelage Automatisches Erstellen der gemammote Objekte in Entitäten Datenbankprogrammierung 8
N Hibernate Entitäten bei Selects aus 2 Tabellen Datenbankprogrammierung 7

Ähnliche Java Themen


Oben