(Quick Reference)
findOrCreateBy*
Purpose
Dynamic method that uses the properties of the domain class to allow the creation of Grails query method expressions that return the first result of the query.
This method behaves like
findBy except that it should never return null. If a matching instance cannot be found in the
database then a new instance is created, populated with values represented in the query parameters, saved and returned. The difference between
this method and
findOrCreateBy is that this method will save any newly created instance where
findOrCreateBy
does not.
Examples
Given the domain class
Book:
class Book {
String title
String author
}The following are all possible:
def b = Book.findOrSaveByTitleAndAuthor("The Sum of All Fears", "Tom Clancy")The following are roughly equivalent:
def b = Book.findOrSaveByTitleAndAuthor("The Sum of All Fears", "Tom Clancy")def b = Book.findByTitleAndAuthor("The Sum of All Fears", "Tom Clancy")
if(!b) {
b = new Book(title: "The Sum of All Fears", author: "Tom Clancy")
b.save()
}Description
GORM supports the notion of
Dynamic Finders. The
findOrSaveBy* method finds the first result for the given method expression.
Because this method potentially creates a new instance and populates properties on that instance, only exact match criteria are allowed. For
example, Book.findOrSaveByTitle(authorValue) is valid but Book.findOrSaveByAuthorInList(listOfNames) is not.