(快速参考)

findOrCreateBy*

用途

使用域类属性的动态方法会创建查询方法表达式,以返回查询的第一个结果。此方法的行为如同 findBy,但它不会返回 null。如果无法找到匹配的实例,则会创建一个新实例并返回该实例,其中会填充在查询参数中表示的值。此方法与 findOrSaveBy 的不同之处在于,此方法不会保存新创建的实例,而 findOrSaveBy 则会保存。

示例

给定域类 Book

class Book {
   String title
   String author
}

以下所有方法都是可能的

def b = Book.findOrCreateByTitle("The Shining")
b = Book.findOrCreateByTitleAndAuthor("The Sum of All Fears", "Tom Clancy")
b = Book.findByAuthorInList(["Douglas Adams", "Hunter S. Thompson"])

以下方法大致相同

def b = Book.findOrCreateByTitle("The Shining")
def b = Book.findByTitle("The Shining")
if (!b) {
    b = new Book(title: "The Shining")
}

说明

GORM 支持 动态查找器 的概念。findOrCreateBy* 方法会找到给定方法表达式的第一个结果。

由于该方法可能创建一个新的实例并填充该实例的属性,因此仅允许完全匹配的条件。例如,Book.findOrCreateByDate(dateValue) 是有效的,而 Book.findOrCreateByDateGreaterThan(dateValue) 则无效。