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?
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.
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.
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)