Разница между findAll, getAll и list в Граалях
использовать Grails есть несколько способов сделать то же самое.
находит все экземпляры класса домена:
Book.findAll()
Book.getAll()
Book.list()
получает экземпляр класса домена для указанного идентификатора:
Book.findById(1)
Book.get(1)
когда вы используете каждый из них? Есть ли существенные различия в производительности?
3 ответов
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
извлекает один экземпляр по id. Он использует экземпляр кэш, поэтому несколько вызовов в одном сеансе гибернации приведут не более чем к одному вызову базы данных (например, если экземпляр находится в кэше 2-го уровня, и у вас есть включить его.)
findById
является динамическим искателем, как findByName
, findByFoo
, etc. Таким образом, он не использует кэш экземпляра, но может быть кэширован, если включено кэширование запросов (обычно это не очень хорошая идея). get
должно быть предпочтительнее, так как его кэширование намного умнее; кэшированные результаты запроса (даже для одного экземпляра, подобного этому) очищаются пессимистически чаще, чем вы ожидаете, но кэш экземпляра не должен быть таким пессимистичным.
один случай использования Я бы за findById
как проверка, связанная с безопасностью, в сочетании с другим свойством. Например, вместо извлечения CreditCard
экземпляр с помощью CreditCard.get(cardId)
, я бы нашел текущего зарегистрированного пользователя и использовать CreditCard.findByIdAndUser(cardId, user)
. Это предполагает, что CreditCard
есть User user
собственность. Таким образом, оба свойства должны совпадать, и это блокирует доступ хакера к экземпляру карты, так как идентификатор карты может совпадать, но пользователь не будет.
еще одно различие между домен.findByID (id) и домен.get (id) заключается в том, что если вы используете фильтр гибернации, вам нужно использовать домен.findbyid осуществляет(ИД). Домен.get (id) обходит фильтр.
АФАИК, они все одинаковые
Book.findAll()
Book.getAll()
Book.list()
они вернут те же результаты
Book.findById(1)
Book.get(1)
но get(id)
будет использовать кэш (если включено), поэтому следует предпочесть findById(1)