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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top