sort - Diferencia entre findAll, getAll y list en Grails
inner join grails (3)
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)
usará el caché (si está habilitado), por lo que debería preferirse findById(1)
Con Grails hay varias formas 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?
Otra diferencia entre Domain.findByID (id) y Domain.get (id) es que si está utilizando un filtro de hibernación, debe usar Domain.findById (id). Domain.get (id) puentea el filtro.
getAll
es una versión mejorada de get
que toma múltiples identificadores y devuelve una List
de instancias. El tamaño de la lista será el mismo que el número de ID proporcionados; cualquier error dará como resultado un null
en ese espacio. Ver http://grails.org/doc/latest/ref/Domain%20Classes/getAll.html
findAll
te permite usar consultas HQL y admite la paginación, pero no están limitadas a las instancias de la clase de llamada, así que utilizo executeQuery
en executeQuery
lugar. Ver http://grails.org/doc/latest/ref/Domain%20Classes/findAll.html
list
encuentra todas las instancias y admite la paginación. Ver http://grails.org/doc/latest/ref/Domain%20Classes/list.html
get
recupera una sola instancia por id. Utiliza el caché de instancia , por lo que varias llamadas dentro de la misma sesión de Hibernate darán como resultado como máximo una llamada a la base de datos (por ejemplo, si la instancia está en el caché de segundo nivel y la has habilitado).
findById
es un buscador dinámico, como findByName
, findByFoo
, etc. Como tal, no utiliza el caché de instancia, pero puede almacenarse en caché si tiene el caché de consultas habilitado (generalmente 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 única instancia como esta) se borran pesimísticamente con más frecuencia de lo que cabría esperar, pero la memoria caché de instancias no necesita ser tan pesimista.
El caso de uso único que tendría para findById
es como un cheque relacionado con la seguridad, combinado con otra propiedad. Por ejemplo, en lugar de recuperar una instancia de CreditCard
usando CreditCard.get(cardId)
, encontraría el usuario actualmente conectado y usar CreditCard.findByIdAndUser(cardId, user)
. Esto supone que CreditCard
tiene una propiedad de User user
. De esta forma, ambas propiedades tienen que coincidir, y esto impediría que un pirata informático acceda a la instancia de la tarjeta, ya que la identificación de la tarjeta podría coincidir, pero el usuario no lo haría.