Question

Arrière-plan

J'ai une table avec des colonnes id, imageId, PropertyId .

Il pourrait y avoir beaucoup d'images associées à une propriété unique et il pourrait y avoir de nombreuses propriétés associées à une seule image.

imageId - many-to-many - propertyId

J'ai une liste de propertyIds et je veux trouver toutes les images associées à toutes les propertyIds en utilisant Hibernate .

Problème.

En ce moment, je prends une propriété à la fois et en utilisant l'API de trouver tous les critères imageIds associés à ce PropertyId, j'obtenir une liste de imageIds. J'utilise cette liste de imageIds dans la requête suivante et dire

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

Donc, en réalité, le nombre de requêtes DB serait le frapper égal au nombre de propertyIds. Je ne pense pas que ce soit une bonne solution, ayant à frapper les temps de base de données n, j'ai essayé d'utiliser la requête individuelle, mais n'a pas réussi. Y at-il une meilleure solution?

En outre, quand je enfin obtenir la liste des imageIds, est-il une bonne idée (nous prenons pas en compte le nombre de résultats) pour la stocker dans la session utilisateur et paginer ou est-ce une bonne idée de répéter l'ensemble processus ou devrais-je envisager de stocker dans la base de données tout dans le but de pagination?

Était-ce utile?

La solution

Voici un problème avec votre schéma de base de données:

Vous essayez de caser 3 associations distinctes (l'image - collecte, l'image - propriété, collection - propriété) en une seule ImageCollection table. Ce n'est pas une bonne chose. Alors que vous pourriez probablement avec cela en utilisant SQL simple (à un coût de beaucoup de lignes avec des colonnes nulles dans cette table), vous ne serez pas en mesure de carte correctement ce dans Hibernate. BTW, ce tableau n'a pas besoin d'une clé primaire de substitution.

Ce que vous devez faire est de le diviser en 3 tables séparées et mapper votre modèle comme bon nombre à plusieurs dans Hibernate. Par exemple:

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

  ...
}

table IMAGE_PROPERTIES aura seulement des colonnes de IMAGE_ID et PROPERTY_ID; vous aurez des tables de COLLECTION_IMAGES et COLLECTION_PROPERTIES tout comme il ainsi.

Vous serez alors en mesure d'interroger les images par les noms de propriétés comme:

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

Si vos propriétés sont vraiment comme des étiquettes, jetez un oeil à cet article ET / OU / UNION Exemples de requête.

Si les propriétés que vous êtes vraiment des propriétés (qui est, ils ont le cycle de vie de l'entité propriétaire et ne peut appartenir à plus d'une entité à la fois), envisager de les diviser en deux tables (une pour les images et une des collections) et à l'aide d'un à-plusieurs. De cette façon, vous ne serez pas les tables de IMAGE_PROPERTIES qui ont besoin et COLLECTION_PROPERTIES d'en haut.

Autres conseils

Vous avez donc une classe comme celui-ci (Note: Je n'ai pas écrit cela avec un ide, de sorte que le code peut ne pas être syntaxiquement correct):

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

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

Ainsi, une requête comme select property from Property property vous devriez obtenir la liste des propriétés que vous pouvez obtenir à travers les propriétés Java normales.

Est-ce que vous cherchez, ou ai-je mal comprendre la question?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top