Grails 域中的瞬态属性

Posted

技术标签:

【中文标题】Grails 域中的瞬态属性【英文标题】:Transient property in Grails domain 【发布时间】:2011-07-20 07:21:37 【问题描述】:

我有一个名为 People 的 Grails 域,我想检查每个 People 是否有孩子。 Childs 是其他 People 对象。这是我的域结构:

class People implements Serializable 

    static constraints = 
        name (nullable : false, unique : true)
        createdBy (nullable : false)
        creationDate (nullable : false)
    

    static transients = ['hasChild']

    static mapping = 
        table 'PEOPLE'
        id generator: 'sequence', params : [sequence : 'SEQ_PK_ID']
        columns 
            id column : 'APEOPLE_ID'
            parentPeople column : 'PARENT_PEOPLE_ID'
        
        parentPeople lazy : false
    

    People parentPeople
    String name
    String description

    Boolean hasChild() 
        def childPeoples = People.createCriteria().count  
            eq ('parentPeople', People) 
        
        return (childPeoples > 0)
    

但我不能在任何地方调用 people.hasChild()。你能帮我解决这个问题吗?非常感谢!

【问题讨论】:

【参考方案1】:

这是因为在eq ('parentPeople', People) 中,Grails 无法理解“人”是什么(它是一个类)。您应该将“人”替换为this。例如:

static transients = ["children"]

    def getChildren() 
        def childPeoples = People.findAllByParentPeople(this, [sort:'id',order:'asc'])
    

【讨论】:

你也可以执行setter吗?【参考方案2】:

获得相同结果的另一种方法是使用Named Queries。它看起来更简洁,是专门​​为此目的而创建的。我也喜欢它,因为它符合域模型中静态声明的模式,而且它本质上是一个标准,我在整个应用程序中都使用它。当您可以声明命名查询时,声明一个瞬态然后编写一个闭包似乎有点解决方法......只是我的看法。

试试这样的:

static namedQueries = 
    getChildren 
        projections 
            count "parentPeople"
        
    

【讨论】:

以上是关于Grails 域中的瞬态属性的主要内容,如果未能解决你的问题,请参考以下文章

Grails 2.2.4:瞬态属性:为啥自定义验证器被调用两次?

Grails - 非空属性引用空值或瞬态值

Grails 瞬态属性未在对象创建时获取

Grails:在地图构造函数中设置瞬态字段

Grails - 非空属性仅对并发用户引用空值或瞬态值错误

我应该将瞬态域类放在 grails 应用程序中的啥位置?