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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top