Buena estructura de objetos para los resultados de mi combinación externa izquierda Hibernate
-
05-07-2019 - |
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.
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.