Diferencia entre findAll, getAll y list en Grails
Con Griales hay varias maneras de hacer lo mismo.
Encuentra todas las instancias de clase de dominio:
Book.findAll()
Book.getAll()
Book.list()
Recupera una instancia de la clase de dominio para el id especificado:
Book.findById(1)
Book.get(1)
¿Cuándo usas cada uno? ¿Hay diferencias significativas en el rendimiento?
3 answers
getAll
es una versión mejorada de get
que toma varios id y devuelve un List
de instancias. El tamaño de la lista será el mismo que el número de ids proporcionados; cualquier error resultará en un null
en esa ranura. Véase http://grails.org/doc/latest/ref/Domain%20Classes/getAll.html
findAll
le permite usar consultas HQL y admite la paginación, pero no están limitadas a instancias de la clase que llama, por lo que uso executeQuery
en su lugar. Ver http://grails.org/doc/latest/ref/Domain%20Classes/findAll.html
list
encuentra todas las instancias y admite la paginación. Véase http://grails.org/doc/latest/ref/Domain%20Classes/list.html
get
recupera una sola instancia por id. Utiliza la caché instance , por lo que varias llamadas dentro de la misma sesión de Hibernación darán como resultado, como máximo, una llamada a la base de datos (por ejemplo, si la instancia está en la caché de nivel 2 y la ha habilitado).
findById
es un buscador dinámico, como findByName
, findByFoo
, etc. Como tal, no utiliza la caché de instancias, pero puede almacenarse en caché si tiene habilitado el almacenamiento en caché de consultas (por lo general, no es una buena idea). get
debe ser preferido ya que su almacenamiento en caché es mucho más inteligente; los resultados de las consultas en caché (incluso para una sola instancia como esta) se borran pesimistamente con más frecuencia de lo que cabría esperar, pero la caché de la instancia no necesita ser tan pesimista.
El único caso de uso que tendría para findById
es como una comprobación relacionada con la seguridad, combinado con otra propiedad. Por ejemplo, en lugar de recuperar una instancia CreditCard
usando CreditCard.get(cardId)
, encontraría al usuario actualmente conectado y usaría CreditCard.findByIdAndUser(cardId, user)
. Esto asume que CreditCard
tiene una propiedad User user
. De esa manera, ambas propiedades tienen que coincidir, y esto bloquearía el acceso de un hacker a la instancia de la tarjeta, ya que el id de la tarjeta podría coincidir, pero el usuario no lo haría.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 19:53:14
Otra diferencia entre Dominio.findById (id) y Dominio.get (id) es que si estás usando un filtro de hibernación, necesitas usar Dominio.findById (id). Dominio.get (id) omite el filtro.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-07 19:25:36
AFAIK, estos son todos idénticos
Book.findAll()
Book.getAll()
Book.list()
Estos devolverán los mismos resultados
Book.findById(1)
Book.get(1)
Pero get(id)
utilizará la caché (si está habilitada), por lo que se debe preferir a findById(1)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-19 10:32:40