Gute Objektstruktur für die Ergebnisse meiner Hibernate linke äußere
-
05-07-2019 - |
Frage
Ich muss eine äußere Abfrage machen verbinden, die alle Definitionen abruft und alle Eigenschaften, die sie mit ihnen verbunden sind, die mit einem bestimmten Unternehmen zugeordnet sind.
Ich habe zwei Hibernate Modelle Objekte:
class PropertyDefinition {
@Id
private Long id;
@Column
private String name;
@OneToMany(mappedBy = "propertyDefinition")
private Set<Property> properties = new HashSet<Property>();
}
class Property {
@Id
private Long id;
@ManyToOne
private Integer companyId;
@ManyToOne
private PropertyDefinition propertyDefinition;
}
So ist die Abfrage beendet aussehen wie:
from PropertyDefinition as pd left join pd.properties as props with props.companyId = :companyId
Also alles peachy ist so weit. Das Problem, das ich habe, ist, welche Art von Struktur lagere ich die zurückgegebenen Daten in? Hibernate gibt eine Liste, wo [0] ist die Propertydefinition (soll nie Null sein) und [1] ist die möglicherweise null Property.
Meine Fragen:
- Die widerwärtig und nicht sehr OO freundlich um die Liste des Object [] s zu übergeben.
- Ich kann nicht nur halten auf die Property weil die Liste der Eigenschaften ist es hält nicht auf das Unternehmen beschränkt.
- Ich konnte ein einfaches Objekt erstellen, die einen Verweis auf die Propertydefinition und ein möglicherweise null Eigentum aber seine ineffizient durch die gesamte Liste zu durchlaufen zu haben, hält und setzt die jeweils in diese neue Aufgabe.
Jeder habe einen Vorschlag für eine bessere Abfrage oder eine bessere Abbildungsstruktur? Ich würde wirklich jede Hilfe zu schätzen wissen.
Lösung
Nun, normalerweise auf Sammlung kommt links am besten über holen , die eine Liste von Containerobjekten mit bevölkerten Sammlungen zurückgibt. da Sie with
Zustand jedoch verwenden, das wird nicht für Sie arbeiten.
Wenn Sie eine einfache Halterung für PropertyDefinition
und Property
mit entsprechendem öffentlichem Konstruktor erstellen sind, könnte man sagen, dass Hibernate zurück:
select new Holder(pd, props)
from PropertyDefinition as pd
left join pd.properties as props
with props.companyId = :companyId
Es sollte die Probleme kümmern Sie aufgeführt haben; es ist nicht ideal, aber wahrscheinlich ist die beste Lösung unter den gegebenen Umständen.