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!

È stato utile?

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

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