Grails按另一个域的属性过滤域类

时间:2013-10-02 05:35:55

标签: grails hibernate-criteria named-query

我有一个Grails应用程序,想要使用named query为我的域类创建过滤器 我有域ActStatusStatusNameEnum

class Act {
    static hasMany = [status : Status]
}

class Status {
    Date setDate
    StatusName name
    static belongsTo = [act : Act]
}

我想过滤其最新状态名称等于特定名称的Acts。
现在我在Act

中有这段代码
static namedQueries = {
    filterOnStatus { StatusName s ->
        status {
            order('setDate', 'desc')
            eq 'name', s
            // I need only first Status, with most recent setDate
            // among all Statuses of that Act
        }
    }
}

但是这会过滤所有具有特定名称状态的行为,而不仅仅是最近的行为。我试图将maxResult 1置于查询中,但似乎无法正常工作 任何帮助将不胜感激。

编辑:问题解决了这个问题:

filteronStatus {
    createAlias('status', 's1')
    eq 's1.name', s
    eq 's1.setDate', new DetachedCriteria(Status).build {
        projections {
            max('setDate')
            eqProperty('act', 's1.act')
        }
    }
}

1 个答案:

答案 0 :(得分:1)

see 'namedQueries' from Grails Doc

//获得一个最近的法案

def recentAct = Act.filterOnStatus(statusName).get()

ADD:

<强> HQL

"select s1.act from Status as s1 \
            where s1.name = :statusName \
            and s1.setDate = (select max(s0.setDate) from s1.act.status s0)"

<强> NamedQuery

listByStatus { statusName ->
            createAlias('status', 's1')
            eq 's1.name', statusName
            eq 's1.setDate', new DetachedCriteria(Status).build{ projections { max('setDate')} eqProperty('act','s1.act') }
        }