Разница между 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)