(快速參考)

findOrSaveBy*

目的

動態方法,使用網域類別的屬性來建立查詢方法表達式,回傳查詢的第一個結果。此方法的行為類似於 findBy,但它絕不會回傳 null。如果找不到相符的執行個體,則會建立一個新的執行個體,填入查詢參數中表示的值,並儲存和回傳。此方法與 findOrCreateBy 的差異在於,此方法會儲存任何新建立的執行個體,而 findOrCreateBy 則不會。

範例

假設有網域類別 Book

class Book {
   String title
   String author
}

以下皆為可能

def b = Book.findOrSaveByTitleAndAuthor("The Sum of All Fears", "Tom Clancy")

以下大致相同

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()
}

說明

GORM 支援 動態尋找器 的概念。findOrSaveBy* 方法會尋找給定方法表達式的第一個結果。

由於此方法可能會建立新的執行個體並填入該執行個體的屬性,因此僅允許完全相符的條件。例如,Book.findOrSaveByTitle(authorValue) 是有效的,但 Book.findOrSaveByAuthorInList(listOfNames) 則不是。