Pergunta

Fundo

Eu tenho uma mesa com colunas ID, ImageId, PropertyID.

Pode haver muitas imagens associadas a uma única propriedade e pode haver muitas propriedades associadas a uma única imagem.

imageId - many-to-many - propertyId

Eu tenho uma lista de PropertyIds e quero descobrir todas as imagens associadas a todos os propriedades usando hibernato.

Problema.

Agora eu escolho uma propriedade de cada vez e, usando a API de critérios, encontre todos os ImageIds associados a este PropertyID, obtenho uma lista de ImageIds. Eu uso esta lista de imageids na próxima consulta e digo

select imageIds where imageId in (imageIds obtained in previous step) where propertyId = x

Assim, o número de consultas que atingem o banco de dados seria igual ao número de PropertyIds. Eu não acho que essa seja uma boa solução, tendo que atingir o banco de dados N vezes, tentei usar a consulta desapegada, mas não consegui. Existe uma solução melhor?

Além disso, quando finalmente obtenho a lista de imageids, é uma boa idéia (não vamos levar em consideração o número de resultados) para armazená -lo na sessão do usuário e pagar ou é uma boa idéia repetir todo o processo ou deve Considero armazená -lo no banco de dados para fins de paginação?

Foi útil?

Solução

Aqui está um problema com seu esquema de banco de dados:

Você está tentando colocar 3 associações separadas (imagem - coleção, imagem - propriedade, coleção - propriedade) em um único ImageCollection tabela. Isso não é uma coisa boa. Embora você provavelmente possa se safar usando isso usando SQL simples (a um custo de muitas linhas com colunas nulas nessa tabela), você não poderá mapear corretamente isso em Hibernate. BTW, esta tabela não precisa de uma chave primária substituta.

O que você precisa fazer é dividi-lo em 3 tabelas separadas e mapear seu modelo como de maneira adequada para muitos em hibernação. Por exemplo:

@Entity
public class Image {
  @ManyToMany
  @JoinTable(
    name="IMAGE_PROPERTIES",
    joinColumns=@JoinColumn(name="IMAGE_ID"),
    inverseJoinColumns=@JoinColumn(name="PROPERTY_ID")
  )
  private Collection<Property> properties;

  ...
}

IMAGE_PROPERTIES Tabela só terá IMAGE_ID e PROPERTY_ID colunas; voce terá COLLECTION_IMAGES e COLLECTION_PROPERTIES mesas como isso também.

Você poderá consultar imagens por nomes de propriedades como:

from Image img
  left join img.properties as prop
  with prop.name in ('Tag1', 'Tag2', 'Tag3')

Se suas propriedades são realmente como tags, dê uma olhada em Este artigo para e / ou exemplos de consulta de união.

Se suas propriedades são realmente propriedades (ou seja, elas têm o ciclo de vida da entidade do proprietário e não podem pertencer a mais de uma entidade de uma só vez), considere dividi-las em duas tabelas (uma para imagens e outra para coleções) e usar um- Associações para muitos. Assim você não precisará IMAGE_PROPERTIES e COLLECTION_PROPERTIES mesas de cima.

Outras dicas

Então você tem uma aula como esta (Nota: eu não escrevi isso com um IDE, então o código pode não estar sintaticamente correto):

public class Property {
@ManyToMany
private List<Image> images;
}

public class Image {
@ManyToMany
private List<Property> properties;
}

Então, uma consulta como select property from Property property deve obter a lista de propriedades, que você pode obter através das propriedades Java normais.

É isso que você está procurando ou entendi mal a pergunta?

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