【发布时间】:2013-10-02 05:35:55
【问题描述】:
我有一个 Grails 应用程序,想使用 named query 为我的域类创建过滤器。
我有域名Act 和Status,StatusName 是Enum:
class Act {
static hasMany = [status : Status]
}
class Status {
Date setDate
StatusName name
static belongsTo = [act : 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')
}
}
}
【问题讨论】:
-
“最近的”是什么意思?您需要将日期添加到命名查询的参数中。如果
setDate大于该日期 - 状态在您的“最近”范围内。 -
Act有几种状态。每个Status在设置时都有一个日期 (setDate)。最近的状态是指Status,在所有状态中最近的setDate。
标签: grails hibernate-criteria named-query