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?

 50
Author: Arturo Herrero, 2012-01-18

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.

 89
Author: Burt Beckwith,
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.

 12
Author: Brad Rhoads,
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)

 4
Author: Dónal,
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