Question

Cela peut être une réponse super facile, car je suis sûr que ce n'est pas rare. Je vois des questions similaires, mais rien qui semble décrire mon problème.

J'ai deux objets: une voiture et par personne. Ils sont dans un grand nombre à plusieurs, à savoir une voiture peut appartenir à plusieurs personnes, et une personne peut posséder plusieurs voitures. Car a un ensemble initialisé paresseusement de Drivers:

@ManyToMany(targetEntity=Person.class, fetch=FetchType.LAZY)
private Set<Person> people;

Je veux trouver toutes les voitures bleues avec les propriétaires de moins de 25 ans:

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();

Mon problème est quand j'itérer la liste et appel getDrivers() sur chaque voiture, il initialise la collecte et obtient tous les pilotes de cette voiture. Je suppose que le .list() je courais ne fixe pas les résultats sur chaque voiture.

Je reviens les résultats que j'attends si je lance manuellement la veille prolongée SQL est la génération, donc je suis raisonnablement sûr que les critères ne sont pas la question.

Je peux comprendre pourquoi cela arrive, mais je ne suis pas sûr de savoir comment se déplacer sans itérer sur chaque voiture et exécution d'une requête pour les pilotes sur chacun. Je voudrais éviter de faire cela si possible et apprécierait des conseils.

Merci à l'avance!

Était-ce utile?

La solution

espériez-vous que la collection de pilotes pour chaque voiture ne contiendrait personnes qui correspondent à vos critères (à savoir sont plus de 25)? En d'autres termes, vous ne voulez pas la collection contenant les pilotes des gens qui sont plus de 25?

Si tel est le cas, vous devez utiliser un ResultTransformer (voir article 15.4 de la documentation Hibernate), car Hibernate ne les collections pré-filtre pas avant de retourner les résultats.

Si toutefois le problème est la collecte des pilotes est en cours de chargement paresseux et qui n'est pas souhaitable alors régler le mode de récupération (je généralement utiliser JOIGNEZ depuis IIRC FetchMode.EAGER a été dépréciée) devrait résoudre le problème:

baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
    .setFetchMode("drivers", FetchMode.JOIN)
    // add additional restrictions here
    .list();

Autres conseils

l'article 15.5 de la documentation de mise en veille prolongée. Fondamentalement, vous pouvez définir la stratégie de récupération pour vos criteria, qui devrait avoir la priorité sur la stratégie de base chercher que vous avez défini pour la relation.

l'exemple de la documentation

List cats = sess.createCriteria(Cat.class)
   .add( Restrictions.like("name", "Fritz%") )
   .setFetchMode("mate", FetchMode.EAGER)
   .setFetchMode("kittens", FetchMode.EAGER)
   .list();

et la documentation http://docs.jboss.org/hibernate/core /3.3/reference/en/html/querycriteria.html

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