(快速参考)

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) 却无效。