Domanda

Sfondo

Ho una tabella con le colonne id, ImageID, della proprieta '.

Ci potrebbero essere molte immagini associate a una singola proprietà e ci potrebbero essere molte proprietà associate a una singola immagine.

imageId - many-to-many - propertyId

Ho una lista di propertyIds e voglio scoprire tutte le immagini associate a tutte le propertyIds usando Hibernate .

Problema.

Proprio ora mi prendo una proprietà alla volta e utilizzando l'API Criteri di trovare tutti i imageIds associati a questa proprieta ', posso ottenere un elenco di imageIds. Io uso questo elenco di imageIds nella prossima query e dico

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

Quindi in modo efficace, il numero di query che colpisce il DB sarebbe pari al numero di propertyIds. Non credo che questa è una buona soluzione, avendo a colpire i tempi del database n, ho provato ad utilizzare Staccata di query, ma non ci sono riuscito. C'è una soluzione migliore?

Inoltre, quando finalmente ottengo l'elenco dei imageIds, è una buona idea (non dobbiamo prendere in considerazione il numero di risultati) per memorizzarlo nella sessione utente e impaginare o è una buona idea di ripetere l'intero processo o sono io considero di riporlo nel DB tutto allo scopo di impaginazione?

È stato utile?

Soluzione

Ecco un problema con lo schema del database:

Si sta cercando di stipare 3 associazioni separate (immagine - la raccolta, l'immagine - di proprietà, collezione - di proprietà) in un unico ImageCollection tavolo. Questa non è una buona cosa. Mentre si potrebbe probabilmente ottenere via con questo utilizzando SQL pianura (al costo di un sacco di righe con colonne null in quel tavolo), non sarà in grado di mappare correttamente questo in Hibernate. BTW, questa tabella non ha bisogno di una chiave primaria surrogata.

Quello che dovete fare è dividere in 3 tavoli separati e mappare il modello come una corretta molti-a-molti in Hibernate. Ad esempio:

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

  ...
}

Tavolo IMAGE_PROPERTIES avrà solo IMAGE_ID e PROPERTY_ID colonne; si avrà tavoli COLLECTION_IMAGES e COLLECTION_PROPERTIES proprio come esso pure.

Sarà quindi in grado di interrogare le immagini da nomi di proprietà, come:

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

Se le proprietà sono davvero come i tag, un'occhiata a questo articolo per E / O / Union esempi di query.

Se le proprietà sono davvero proprietà (cioè, essi hanno il ciclo di vita del soggetto proprietario e non può appartenere a più di un'entità in una sola volta), in considerazione dividendoli in due tavoli (uno per le immagini e uno per collezioni) e utilizzando le associazioni uno-a-molti. In questo modo non avrà bisogno di tavoli e IMAGE_PROPERTIES COLLECTION_PROPERTIES dall'alto.

Altri suggerimenti

In modo da avere una classe come questa (Nota: non ho scritto questo con un IDE, in modo che il codice potrebbe non essere sintatticamente corretto):

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

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

Quindi una query come select property from Property property dovrebbe ottenere l'elenco delle proprietà, che si può arrivare a attraverso le normali proprietà Java.

E 'questo che stai cercando, o ha fatto mi fraintendere la questione?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top