Buena estructura de objetos para los resultados de mi combinación externa izquierda Hibernate

StackOverflow https://stackoverflow.com/questions/1407862

Pregunta

Necesito realizar una consulta de combinación externa que recupere todas las definiciones y las propiedades que tengan asociadas con una compañía determinada.

Tengo dos objetos de modelos 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;
}

Así que la consulta termina pareciendo:

from PropertyDefinition as pd left join pd.properties as props with props.companyId = :companyId

Así que todo es melocotón hasta ahora. El problema que tengo es en qué tipo de estructura almaceno los datos devueltos? Hibernate devuelve una lista donde [0] es la definición de propiedad (nunca debe ser nula) y [1] es la propiedad posiblemente nula.

Mis problemas:

  • Es desagradable y no muy amigable con OO para pasar por la Lista de objetos [] s.
  • No puedo limitarme a la definición de propiedad porque la lista de propiedades que posee no se limita a la compañía.
  • Podría crear un objeto simple que contenga una referencia a la definición de propiedad y una propiedad posiblemente nula, pero es ineficiente tener que recorrer toda la lista y colocar cada uno en este nuevo objeto.

¿Alguien tiene una sugerencia para una mejor consulta o una mejor estructura de mapeo? Realmente agradecería cualquier ayuda.

¿Fue útil?

Solución

Bueno, normalmente la unión izquierda en la colección se maneja mejor a través de fetch que devuelve una lista de objetos contenedores con colecciones pobladas. Sin embargo, dado que está utilizando con la condición , eso no funcionará para usted.

Si tuviera que crear un titular simple para PropertyDefinition y Property con el constructor público apropiado, podría decirle a Hibernate que devuelva eso:

select new Holder(pd, props)
  from PropertyDefinition as pd
  left join pd.properties as props
  with props.companyId = :companyId

Debería ocuparse de los problemas que has enumerado; no es lo ideal, pero probablemente sea la mejor solución disponible en estas circunstancias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top