Bonne structure d'objet pour les résultats de ma jointure externe gauche Hibernate
-
05-07-2019 - |
Question
Je dois créer une requête de jointure externe qui récupère toutes les définitions et toutes les propriétés associées à une société donnée.
J'ai deux objets modèles Hibernate:
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;
}
La requête ressemble donc à:
from PropertyDefinition as pd left join pd.properties as props with props.companyId = :companyId
Donc, tout est pêche jusqu'à présent. Le problème que je rencontre est quelle sorte de structure est-ce que je stocke les données retournées? Hibernate renvoie une liste où [0] est la propriété PropertyDefinition (ne doit jamais être null) et [1] est la propriété éventuellement nulle.
Mes problèmes:
- Il est odieux et très peu OO de faire circuler la liste des objets [] s.
- Je ne peux pas me contenter de PropertyDefinition car la liste des propriétés qu'il contient n'est pas limitée à l'entreprise.
- Je pourrais créer un objet simple contenant une référence à PropertyDefinition et une propriété éventuellement nulle, mais il serait inefficace de devoir parcourir l'ensemble de la liste et de placer chacun dans ce nouvel objet.
Quelqu'un a-t-il une suggestion pour une meilleure requête ou une meilleure structure de mappage? J'apprécierais vraiment toute aide.
La solution
Eh bien, il est préférable de gérer la jointure laissée normalement lors de la collecte via fetch qui renvoie une liste d'objets conteneur avec des collections remplies. Cependant, comme vous utilisez avec
, cela ne fonctionnera pas pour vous.
Si vous deviez créer un détenteur simple pour PropertyDefinition
et Property
avec le constructeur public approprié, vous pourriez demander à Hibernate de renvoyer ce qui suit:
select new Holder(pd, props)
from PropertyDefinition as pd
left join pd.properties as props
with props.companyId = :companyId
Cela devrait régler les problèmes que vous avez énumérés; ce n’est pas idéal, mais c’est probablement la meilleure solution disponible dans les circonstances.