Buona struttura dell'oggetto per i risultati del mio join esterno sinistro di Hibernate
-
05-07-2019 - |
Domanda
Devo fare una query di join esterna che recuperi tutte le definizioni e tutte le proprietà ad esse associate associate a una determinata azienda.
Ho due oggetti modelli 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;
}
Quindi la query finisce per apparire come:
from PropertyDefinition as pd left join pd.properties as props with props.companyId = :companyId
Quindi tutto è peachy finora. Il problema che sto riscontrando è in che tipo di struttura immagazzino i dati restituiti? Hibernate restituisce un elenco in cui [0] è la PropertyDefinition (non dovrebbe mai essere nulla) e [1] è la proprietà eventualmente nulla.
I miei problemi:
- È odioso e non molto OO amichevole passare in giro per la Lista degli oggetti [] s.
- Non posso limitarmi a trattenere PropertyDefinition perché l'elenco di proprietà che detiene non è limitato alla società.
- Potrei creare un oggetto semplice che contiene un riferimento a PropertyDefinition e una proprietà eventualmente nulla ma è inefficiente dover scorrere l'intero Elenco e inserirli tutti in questo nuovo oggetto.
Qualcuno ha un suggerimento per una query migliore o una migliore struttura di mappatura? Gradirei davvero qualsiasi tipo di assistenza.
Soluzione
Bene, normalmente il join sinistro sulla raccolta viene gestito meglio tramite fetch che restituisce un elenco di oggetti contenitore con raccolte popolate. Tuttavia, poiché stai usando con
, non funzionerà per te.
Se dovessi creare un titolare semplice per PropertyDefinition
e Property
con un costruttore pubblico appropriato, potresti dire a Hibernate di restituire che:
select new Holder(pd, props)
from PropertyDefinition as pd
left join pd.properties as props
with props.companyId = :companyId
Dovrebbe occuparsi dei problemi che hai elencato; non è l'ideale ma probabilmente è la migliore soluzione disponibile in queste circostanze.