Grails按另一个域的属性筛选域类

Grails按另一个域的属性筛选域类,grails,hibernate-criteria,named-query,Grails,Hibernate Criteria,Named Query,我有一个Grails应用程序,希望使用命名查询为我的域类创建过滤器 我有域Act和Status,StatusName是一个Enum: class Act { static hasMany = [status : Status] } class Status { Date setDate StatusName name static belongsTo = [act : Act] } 我想筛选其最近的状态名称等于特定名称的行为。 现在我在法案中有了这个代码: s

我有一个Grails应用程序,希望使用
命名查询
为我的域类创建过滤器
我有域
Act
Status
StatusName
是一个
Enum

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

class Status {
    Date setDate
    StatusName name
    static belongsTo = [act : 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')
        }
    }
}

//最近的一幕

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

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') }
        }

我不需要一个最近的行为,我需要满足“此行为的最新状态的StatusName等于指定”标准的所有行为。您提供的代码为我提供了一个Act,其最新状态为all.def recentAct=Act.filterOnStatus(statusName)…listdinct()尝试def recentAct=Act.filterOnStatus(statusName).listdinct()。无论如何,我建议使用模型:Act{Status lastStatus};是的,我想在
Act
中添加新字段。但只有在我确定没有其他办法解决这个问题的情况下,我才会这么做。而
listDistinct()
不是解决这个问题的方法你所说的“最近的”是什么意思?您需要将日期添加到命名查询的参数中。如果
setDate
大于该日期-状态在您的“最近”范围内。
Act
有几种状态。每个
状态设置时都有一个日期(
setDate
)。最近状态是指所有状态中最近的
状态
,以及最近的
设置日期