Boa estrutura do objeto de resultados do meu Hibernate LEFT JOIN externa
-
05-07-2019 - |
Pergunta
Eu preciso fazer uma junção externa consulta que recupera todas as definições e as propriedades que têm associados a eles que estão associados a uma determinada empresa.
Eu tenho dois Hibernate modelos objetos:
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;
}
Assim, as extremidades da consulta acima de olhar como:
from PropertyDefinition as pd left join pd.properties as props with props.companyId = :companyId
Então tudo é peachy até agora. O problema que estou tendo é que tipo de estrutura que eu armazenar os dados retornados em? Hibernate retorna uma lista onde [0] é o PropertyDefinition (nunca deve ser nula) e [1] é a propriedade possivelmente nulo.
As minhas questões:
- A sua detestável e não muito OO amigável para passar em torno da Lista de Object [] s.
- eu não posso simplesmente agarrar o PropertyDefinition porque a lista de propriedades que detém não se limita à empresa.
- eu poderia criar um objeto simples que mantém uma referência para o PropertyDefinition e uma propriedade possivelmente nulo, mas a sua ineficiente ter que percorrer toda a lista e colocar cada um em este novo objeto.
Alguém tem uma sugestão para uma consulta melhor ou uma melhor estrutura de mapeamento? Eu realmente aprecio qualquer ajuda.
Solução
Bem, normalmente o esquerdo se juntar na coleção é melhor tratada através de buscar que retorna uma lista de objetos de recipiente com coleções povoadas. No entanto, desde que você está usando condição with
, que não vai funcionar para você.
Se você tivesse que criar um simples suporte para PropertyDefinition
e Property
com construtor público apropriado, você poderia dizer Hibernate para retornar o seguinte:
select new Holder(pd, props)
from PropertyDefinition as pd
left join pd.properties as props
with props.companyId = :companyId
Deve cuidar das questões que você listou; não é ideal, mas provavelmente é a melhor solução disponível sob as circunstâncias.