Unterschied zwischen findAll, getAll und list in Grails
Mit Grails gibt es mehrere Möglichkeiten, das gleiche zu tun.
Findet alle domain-Klassen-Instanzen:
Book.findAll()
Book.getAll()
Book.list()
Ruft eine Instanz der domain-Klasse für die angegebene id:
Book.findById(1)
Book.get(1)
Wann verwendet man die? Gibt es signifikante Unterschiede in der Leistung?
InformationsquelleAutor der Frage Arturo Herrero | 2012-01-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
getAll
ist eine erweiterte version desget
dass dauert mehrere ids und gibt eineList
von Instanzen. Die Liste Größe werden die gleichen sein, wie die Anzahl der zur Verfügung gestellten ids; jeder findet dadurch einenull
bei diesem slot. Sehen http://grails.org/doc/latest/ref/Domain%20Classes/getAll.htmlfindAll
ermöglicht Ihnen die Verwendung von HQL-Abfragen und unterstützt Paginierung, aber Sie sind nicht beschränkt auf Instanzen der aufrufenden Klasse also ich benutzeexecuteQuery
statt. Sehen http://grails.org/doc/latest/ref/Domain%20Classes/findAll.htmllist
findet alle Instanzen und die Paginierung unterstützt. Sehen http://grails.org/doc/latest/ref/Domain%20Classes/list.htmlget
ruft eine single-Instanz-id. Es verwendet die Instanz cache, so dass mehrere Anrufe innerhalb des gleichen Hibernate-session wird im Ergebnis höchstens eine Datenbank aufrufen (z.B. wenn die Instanz in der 2.-level-cache und du Sie aktiviert hast).findById
ist eine dynamische finder, wiefindByName
,findByFoo
usw. Als solche hat Sie nicht verwenden Sie die Instanz-cache, aber zwischengespeichert werden kann, wenn Sie query-caching (in der Regel nicht eine gute Idee).get
sollte bevorzugt werden, da seine caching ist um einiges schlauer; zwischengespeicherte Abfrageergebnisse (auch für eine einzelne Instanz wie diese) sind pessimistisch gelöscht, oft mehr, als Sie erwarten würden, aber die Instanz-cache braucht nicht so pessimistisch zu sein.Die eine Verwendung hätte ich für
findById
ist als eine sicherheitsbezogene Prüfung, in Verbindung mit einer anderen Eigenschaft. Zum Beispiel anstelle von abrufen einerCreditCard
Instanz mitCreditCard.get(cardId)
würde ich den aktuell angemeldeten Benutzer und die VerwendungCreditCard.findByIdAndUser(cardId, user)
. Dies setzt Voraus, dassCreditCard
hat eineUser user
Eigenschaft. So beide Eigenschaften übereinstimmen müssen, und diese blockieren würde ein hacker Zugriff auf das Karten-Beispiel, da die Karten-id entsprechen könnten, aber der Benutzer nicht.InformationsquelleAutor der Antwort Burt Beckwith
Weiterer Unterschied zwischen Domain.findByID(id) und die Domain.get(id) ist, dass wenn Sie mit einer hibernate-filter, müssen Sie die Verwendung der Domain.findById(id). Domain.get(id) umgeht den filter.
InformationsquelleAutor der Antwort Brad Rhoads
AFAIK, diese sind alle identisch
Diese werden dieselben Ergebnisse zurückgegeben
aber
get(id)
wird Verwendung des cache (falls aktiviert), so sollte bevorzugt werden, umfindById(1)
InformationsquelleAutor der Antwort Dónal