问题描述
我正在使用 grails(版本 3.1.5)并尝试按儿童班级的最大日期对列表进行排序
域:
class Entity {
static hasMany = [childrens: Children]
}
class Children {
Date date
}
SELECT
*
FROM
entity
INNER JOIN
children c1 ON c1.entity_id = entity.id
WHERE
c1.date =
(SELECT MAX(c2.date) FROM children c2 WHERE c2.entity_id = c1.entity_id)
ORDER BY
c1.date DESC
有谁知道如何使用标准来做到这一点?
编辑:
我能够使用下面的代码执行正确的查询,但我无法在实体列表中转换结果(因为投影):
Entity.createCriteria().list(params) {
childrens {
projections {
groupProperty 'entity'
max 'date','maxDate'
}
}
order 'maxDate','desc'
}
解决方法
解决此类问题的最简单方法是添加一些冗余:
class Entity {
Date maxChildrenDate
def beforeInsert() {
maxChildrenDate = childrens.*date.max()
}
def beforeUpdate() {
beforeInsert()
}
static hasMany = [childrens: Children]
}
然后查询很简单:
def list = Entity.list( sort:'maxChildrenDate',order:'asc' )
要设置/更新 maxChildrenDate
,您可能需要使用上面显示的拦截器。