getAll
- это расширенная версия get
, которая принимает несколько идентификаторов и возвращает List
экземпляров. Размер списка будет таким же, как количество предоставленных идентификаторов; любые пропуски приведут к null
в этом слоте. Смотри http://grails.org/doc/latest/ref/Domain%20Classes/getAll.html
findAll
позволяет вам использовать HQL-запросы и поддерживает разбиение на страницы, но они не ограничиваются экземплярами вызывающего класса, поэтому я вместо этого использую executeQuery
. Смотри http://grails.org/doc/latest/ref/Domain%20Classes/findAll.html
list
находит все экземпляры и поддерживает нумерацию страниц. Смотри http://grails.org/doc/latest/ref/Domain%20Classes/list.html
get
извлекает один экземпляр по идентификатору. Он использует кэш instance , поэтому несколько вызовов в одном сеансе Hibernate приведут к максимум одному вызову базы данных (например, если экземпляр находится в кэше 2-го уровня и вы его включили).
findById
- это динамический искатель, такой как findByName
, findByFoo
и т. Д. Как таковой, он не использует кэш экземпляра, но может кэшироваться, если у вас включено кэширование запросов (обычно это не очень хорошая идея). get
должно быть предпочтительным, поскольку его кэширование намного умнее; результаты кэшированных запросов (даже для такого экземпляра, как этот) очищаются пессимистически чаще, чем вы ожидаете, но кэш экземпляров не должен быть таким пессимистичным.
Один вариант использования, который я бы использовал для findById
, связан с проверкой безопасности в сочетании с другим свойством. Например, вместо извлечения CreditCard
экземпляра с использованием CreditCard.get(cardId)
я бы нашел текущего пользователя, вошедшего в систему, и использовал бы CreditCard.findByIdAndUser(cardId, user)
. Это предполагает, что CreditCard
имеет свойство User user
. Таким образом, оба свойства должны совпадать, и это не позволит хакеру получить доступ к экземпляру карты, поскольку идентификатор карты может совпадать, но пользователь не сможет.