Grails在域类中计算一对多的子项

时间:2014-07-07 17:12:36

标签: grails gorm

我有一对多的关系:

class Author {
    String name
    static hasMany = [books:Book]
    static constraints = {
    }
}

class Book {
    String name
    static belongsTo = [author:Author]
    static constraints = {
    }
}

我希望能够计算作者类中属于作者的书籍数量,以便生成的MySQL表格如下所示:

id | version | name | bookcount
-- | ------- | ---- | ---------
 1 |       0 | foo  |        15
 2 |       0 | bar  |         3
 3 |       0 | baz  |         7

...其中bookcount是作者类中的已定义字段:

class Author {
    String name
    int bookcount = ??
    static constraints = {
    }
}

编辑1: bookcount必须保存在数据库中。

2 个答案:

答案 0 :(得分:2)

另一种方法是,如果你不想将所有孩子从数据库中拉出来并对它们进行计数,这对于非常大的数据集来说可能是坏事,在父类上这样的方法是这样的。

    def numberOfChildren()
{
    def result = Child.executeQuery("select count(*) from Child where parent = :parent", ["parent":this])
    def resultCount = result[0]
    return resultCount
}

答案 1 :(得分:1)

您可以使用gorm events执行以下操作:

class Author {
    String name

    Integer bookCount = 0
    static hasMany = [books:Book]

    Integer getBookCount () {
        books?.size () ?: 0
    }

    void beforeUpdate () {
        bookCount = getBookCount ()
    }

    static constraints = {
    }
}

在数据库中更新对象之前,将调用beforeUpdate方法。

getBookCount()属性getter确保我们始终获得正确的值。如果在添加更多Book后作者尚未保存,bookCount将不会是最新的,直到作者为save() d。

如果我们不使用代码中的bookCount,我们可以内联它。

def "explicitly persist book count" () {
    given:
    Author author = new Author(name:'author')
    author.save (failOnError: true)

    when:
    author.addToBooks (new Book(name:'book'))
    author.save (failOnError: true, flush: true)

    then:
    author.bookCount == 1
    author.@bookCount == 1
}