Filtrata inizializzate in maniera Sospensione Collection
-
27-09-2019 - |
Domanda
Questa potrebbe essere una risposta super facile, dato che io sono sicuro che non è raro. Vedo alcune domande simili, ma nulla che sembra descrivere il mio problema.
Ho due oggetti: una macchina e persona. Sono in una relazione molti-a-molti, vale a dire una macchina può essere di proprietà di più persone, e una persona può possedere più auto. Car
ha una serie pigramente inizializzato di Drivers
:
@ManyToMany(targetEntity=Person.class, fetch=FetchType.LAZY)
private Set<Person> people;
Voglio trovare tutte le auto blu con i proprietari sotto l'età di 25:
Criteria foo = persistenceManager.createCriteria(Car.class, "myCarAlias");
Criteria bar = foo.createCriteria("drivers", "myDriverAlias");
//add restrictions on foo and bar for blue and age, respectively
baz = foo.list();
Il mio problema è quando ho scorrere l'elenco delle chiamate e getDrivers()
su ogni vettura, inizializza la raccolta e ottiene tutti driver che della vettura. Credo che il .list()
ho eseguito non imposta i risultati su ogni vettura.
mi rimetto i risultati mi aspetto se corro manualmente il codice SQL ibernazione sta generando, quindi sono ragionevolmente sicuro i criteri non è il problema.
posso capire perché questo accade, ma non sono sicuro di come ottenere intorno ad esso, senza l'iterazione di ogni vettura e l'esecuzione di una query per i driver su ciascuno di essi. Vorrei evitare di fare che, se possibile, e gradirebbe qualche consiglio.
Grazie in anticipo!
Soluzione
speravate che la raccolta dei driver per ogni auto conterrebbe solo le persone che corrisponde ai tuoi criteri (vale a dire sono oltre 25)? In altre parole, non si vuole la raccolta dei driver contenente le persone che sono più di 25?
Se questo è il caso allora si avrà bisogno di utilizzare un ResultTransformer (vedi sezione 15.4 della documentazione Hibernate) perché Hibernate non pre-filtro collezioni prima di restituire i risultati.
Se invece il problema è la raccolta dei driver è essere caricato in modo pigro e che non è auspicabile quindi impostando la modalità di fetch (Io di solito utilizzare Collega dal IIRC FetchMode.EAGER è stata sconsigliata) dovrebbe risolvere il problema:
baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
.setFetchMode("drivers", FetchMode.JOIN)
// add additional restrictions here
.list();
Altri suggerimenti
sezione 15.5 della documentazione di sospensione. Fondamentalmente si può impostare la strategia di prendere per i criteri di query, che dovrebbe avere la precedenza sulla strategia di recupero di base è stato definito per il rapporto.
l'esempio dalla documentazione
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.setFetchMode("kittens", FetchMode.EAGER)
.list();
e la documentazione http://docs.jboss.org/hibernate/core /3.3/reference/en/html/querycriteria.html