我有一对多的关系:
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必须保存在数据库中。
答案 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
}