50 votes

Différence entre findAll, getAll et list dans Grails

Avec Grails, il existe plusieurs façons de faire la même chose.

Trouve toutes les instances de la classe du domaine :

Book.findAll()
Book.getAll()
Book.list()

Récupère une instance de la classe de domaine pour l'id spécifié :

Book.findById(1)
Book.get(1)

Quand utilisez-vous chacun d'eux ? Y a-t-il des différences significatives dans les performances ?

90voto

Burt Beckwith Points 46122

getAll est une version améliorée de get qui prend plusieurs identifiants et renvoie un List d'instances. La taille de la liste sera la même que le nombre d'identifiants fournis. null à cet emplacement. Voir http://grails.org/doc/latest/ref/Domain%20Classes/getAll.html

findAll vous permet d'utiliser des requêtes HQL et prend en charge la pagination, mais elles ne sont pas limitées aux instances de la classe appelante. executeQuery à la place. Voir http://grails.org/doc/latest/ref/Domain%20Classes/findAll.html

list trouve toutes les instances et supporte la pagination. Voir http://grails.org/doc/latest/ref/Domain%20Classes/list.html

get récupère une seule instance par id. Il utilise le instance Ainsi, plusieurs appels dans la même session Hibernate entraîneront au maximum un appel à la base de données (par exemple, si l'instance se trouve dans le cache de deuxième niveau et que vous l'avez activé).

findById est un chercheur dynamique, comme findByName , findByFoo etc. En tant que tel, il n'utilise pas le cache d'instance, mais peut être mis en cache si vous avez activé la mise en cache des requêtes (ce qui n'est généralement pas une bonne idée). get est préférable car sa mise en cache est beaucoup plus intelligente ; les résultats des requêtes mises en cache (même pour une seule instance comme celle-ci) sont effacés de manière pessimiste plus souvent que prévu, mais le cache de l'instance n'a pas besoin d'être aussi pessimiste.

Le seul cas d'utilisation que j'aurais pour findById est un contrôle de sécurité, combiné à une autre propriété. Par exemple, au lieu de récupérer une CreditCard en utilisant CreditCard.get(cardId) je trouverais l'utilisateur actuellement connecté et utiliserais CreditCard.findByIdAndUser(cardId, user) . Cela suppose que CreditCard a un User user propriété. Ainsi, les deux propriétés doivent correspondre, ce qui empêcherait un pirate d'accéder à l'instance de la carte puisque l'identifiant de la carte pourrait correspondre, mais pas l'utilisateur.

12voto

Brad Rhoads Points 859

Une autre différence entre Domain.findByID(id) et Domain.get(id) est que si vous utilisez un filtre hibernate, vous devez utiliser Domain.findById(id). Domain.get(id) permet de contourner le filtre.

4voto

Dónal Points 61837

AFAIK, ils sont tous identiques

Book.findAll()
Book.getAll()
Book.list()

Ceux-ci donneront les mêmes résultats

Book.findById(1)
Book.get(1)

mais get(id) utilisera le cache (s'il est activé), et devrait donc être préféré à findById(1)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X