2010-04-08 5 views
2

Au lieu de renvoyer un List<Long> d'identifiants lors de l'appel PersonDao.getAll(), nous ne voulions pas avoir une collection entière d'identifiants en mémoire.Évitez d'avoir une énorme collection d'identifiants en appelant un DAO.getAll()

Apparemment, renvoyer un org.springframework.jdbc.support.rowset.SqlRowSet et itérer sur cet ensemble de lignes ne conserverait pas tous les objets en mémoire.

Le seul problème ici est que je ne peux pas lancer cette ligne à mon entité.

Y a-t-il un meilleur moyen pour cela?

En général, nous voulons faire une méthode sur chaque personne dans notre db

Répondre

1

Vous pouvez utiliser pour itérer le jeu de résultats, et effacer la session régulière de disposer d'objets non nécessaires. Exemple du livre Hibernate:

ScrollableResults itemCursor = session.createQuery("from Item").scroll(); 
int count=0; 

while (itemCursor.next()) { 
    Item item = (Item) itemCursor.get(0); 
    modifyItem(item); 
    if (++count % 100 == 0) { 
    session.flush(); 
    session.clear(); 
    } 
} 

Voir the Hibernate reference pour plus d'exemples et de détails.

+0

bonne réponse! sauf le rinçage et la compensation j'ai peur de. Est-ce que je veux cela aussi pour d'autres transactions en cours ... StatelessSession me semble le mieux. –

+0

@Michael Bon point, j'ai oublié de mentionner que ceci est supposé être exécuté dans une transaction séparée, pour ne pas gâcher le contexte de persistance. Mais une StatelessSession peut aussi fonctionner. –

+0

éter: Ok, mais quand cela fonctionne dans une transaction sperate, un session.flush/clear affectera toujours toutes les transactions dans cette session, je pense. –

Questions connexes