如何根据Grails上的子集合属性创建域瞬态属性?

时间:2011-08-19 20:09:56

标签: grails grails-domain-class

我有以下域类:

class ParentClass {
    String myProperty
    static hasMany = [ childClasses : ChildClass]
}

class ChildClass {
    Date birthday
    static belongsTo = [ parentClass : ParentClass]
}

我需要能够列出最近孩子的出生日期所订购的ParentClasses。如果我能够使用常规CRUD列表页面中使用的params,那将是最好的。

我知道我可以在控制器中为这个特定的顺序编写一个特定的规则,但我觉得这不是最好的解决方案,我应该根据派生属性或基于标准的瞬态属性使用某些东西,但找不到办法(我对Grails和Hibernate不熟悉)。

任何指针都会受到赞赏。

修改:我设法做到了:

static mapping = {
    mostRecentBirthday formula: '(
        SELECT c.data
        FROM ChildClass c
        WHERE c.parent_class_id=id
        ORDER BY c.birthday DESC LIMIT 1
    )'
}

我对此解决方案的唯一问题是parent_class_id在那里是硬编码的。有没有更正确的方法来写这个?

2 个答案:

答案 0 :(得分:0)

如果我理解正确,那么你可以这样做:

def parentClass = new ParentClass(params.id);
// let this be your parentclass 
// you want to have the childs from ordered by birthday

def childListOrderedByBirthday = ChildClass.withCriteria {
    parentClass {
        eq("id", parentClass.id);
    }
    order("birthday", "desc")
}.list()

答案 1 :(得分:0)

crudolf方法的替代方法是使用dynamic finder。它看起来像这样:

def parentClass = new ParentClass(params.id);

def childListOrderedByBirthday =
        ChildClass.findAllByParentClass(parentClass,
                [sort: "birthday", order: "desc"]);

这可能更清晰。