Разница между findAll, getAll и списком в Grails - PullRequest
50 голосов
/ 18 января 2012

С Grails есть несколько способов сделать то же самое.

Находит все экземпляры класса домена:

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

Извлекает экземпляр класса домена для указанного идентификатора:

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

Когда вы используете каждый?Существуют ли существенные различия в производительности?

Ответы [ 3 ]

89 голосов
/ 18 января 2012

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. Таким образом, оба свойства должны совпадать, и это не позволит хакеру получить доступ к экземпляру карты, поскольку идентификатор карты может совпадать, но пользователь не сможет.

12 голосов
/ 07 мая 2013

Другое различие между Domain.findByID (id) и Domain.get (id) заключается в том, что если вы используете фильтр гибернации, вам необходимо использовать Domain.findById (id). Domain.get (id) обходит фильтр.

4 голосов
/ 18 января 2012

AFAIK, все они идентичны

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

Это даст те же результаты

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

, но get(id) будет использовать кеш (если включен), поэтому предпочтительнее будет findById(1)

...