2009-01-21 9 views
4

Une chose que j'aime à propos EclipseLink a cette grande chose appelée le batch query hint, dont je suis encore à trouver un équivalent Hibernate de. Fondamentalement, faire tout un tas de jointures devient vraiment rapide et vous finissez par interroger plus de données que vous ne le souhaitez (souvenez-vous que si vous joignez la personne à 6 adresses, l'information de la personne est retournée 6 fois; par des jointures supplémentaires). Imaginez une entité Personne avec des collections 0: M d'adresses, de courriers électroniques, de numéros de téléphone et d'historiques de commandes. Rejoindre tout ce qui est pas bon, mais avec la méthode de traitement par lots:Hibernate équivalent à l'indice de requête par lots d'EclipseLink?

List persons = entityManager.createQuery("select p from Person p" 
    .setHint(QueryHints.BATCH, "p.address") 
    .setHint(QueryHints.BATCH, "p.email") 
    .setHint(QueryHints.BATCH, "p.phone") 
    .setHint(QueryHints.BATCH, "p.orderHistory") 
    .getResultList(); 

Cela fera une requête sur la table de personne et c'est tout. Lorsque vous accédez pour la première fois à un enregistrement d'adresse, il fait une seule requête pour la table entière. Si vous avez spécifié une clause where dans la table Person, ce même critère sera également utilisé pour le chargement de l'adresse.

Ainsi, au lieu de faire une requête, vous 5.

Si vous faisiez avec vous rejoint pourrait obtenir en une seule requête, mais vous pouvez très bien être de chargement beaucoup plus de données en raison de la joint .

Quoi qu'il en soit, je suis allé chercher dans les docs Hibernate un équivalent à ceci mais je n'en vois pas. Est-ce qu'il y a un?

Répondre

0

Il y a deux choses que je connais qui pourraient aider:

1) hibernate.default_batch_fetch_size

2) Criteria.setFetchMode et Criteria.setFetchSize