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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top