web-dev-qa-db-fra.com

Différence entre findAll, getAll et list dans Grails

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

Recherche toutes les instances de classe de 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? Existe-t-il des différences de performances significatives?

50
Arturo Herrero

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; tout échec entraînera un 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, j'utilise donc executeQuery à la place. Voir http://grails.org/doc/latest/ref/Domain%20Classes/findAll.html

list trouve toutes les instances et prend en charge 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 cache d'instance , donc plusieurs appels dans la même session Hibernate entraîneront au plus un appel de base de données (par exemple si l'instance est dans le 2nd- cache de niveau et vous l'avez activé).

findById est un Finder dynamique, comme findByName, findByFoo, etc. En tant que tel, il n'utilise pas le cache d'instance, mais peut être mis en cache si la mise en cache des requêtes est activée (généralement pas une bonne idée). get devrait être préféré car sa mise en cache est beaucoup plus intelligente; les résultats de requête mis 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 d'instance n'a pas besoin d'être aussi pessimiste.

Le seul cas d'utilisation que j'aurais pour findById est une vérification liée à la sécurité, combinée avec une autre propriété. Par exemple, au lieu de récupérer une instance de CreditCard à l'aide de CreditCard.get(cardId), je trouverais l'utilisateur actuellement connecté et j'utiliserais CreditCard.findByIdAndUser(cardId, user). Cela suppose que CreditCard a un User user propriété. De cette façon, les deux propriétés doivent correspondre, ce qui empêcherait un pirate d'accéder à l'instance de carte car l'ID de la carte pourrait correspondre, mais l'utilisateur ne le ferait pas.

89
Burt Beckwith

Une autre différence entre Domain.findByID (id) et Domain.get (id) est que si vous utilisez un filtre de mise en veille prolongée, vous devez utiliser Domain.findById (id). Domain.get (id) contourne le filtre.

12
Brad Rhoads

AFAIK, ce sont tous identiques

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

Ceux-ci renverront les mêmes résultats

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

mais get(id) utilisera le cache (si activé), donc devrait être préféré à findById(1)

4
Dónal