bir*_*rdy 6 sql grails groovy hibernate grails-orm
我有一个看起来像这样的表:
id name shade date_created
---- ----- ------- ---------------
1 Red bright 10-28-2012
2 Orange light 10-28-2012
3 Red <null> 10-24-2013
4 Orange light 10-24-2013
Run Code Online (Sandbox Code Playgroud)
期望的结果:
id name value date_created
---- ----- ------ ---------
3 Red <null> 10-24-2013
4 Orange light 10-24-2013
Run Code Online (Sandbox Code Playgroud)
我可以用GORM做些什么来获得这个结果?
在纯sql中,这是获得所需结果的查询:
SELECT t.name, t.shade, r.MaxTime
FROM (SELECT name, MAX(date_created) as MaxTime
FROM colorable
GROUP BY name) r
INNER JOIN colortable t ON t.name = r.name AND t.date_created = r.MaxTime
Run Code Online (Sandbox Code Playgroud)
我试过的:
def c = Color.createCriteria()
def results = c {
projections {
groupProperty("name")
max("dateCreated")
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何从投影中获取更多列?即shade列
如果您使用的是Grails 2.0或更高版本,则可以使用分离标准执行此操作:
def colors = Color.withCriteria {
eq "dateCreated", new grails.gorm.DetachedCriteria(Color).build {
projections {
min "dateCreated"
}
}
projections {
property "name"
property "shade"
property "dateCreated"
}
}
Run Code Online (Sandbox Code Playgroud)
明确使用DetachedCriteria该类有点难看,但它并不太糟糕.此查询也应该可以作为Where查询,但似乎有一个错误,这意味着您不能将'=='与聚合函数一起使用.修复错误后,您应该能够:
def colors = Color.where {
dateCreated == max(dateCreated)
}.property("name").property("shade").property("dateCreated").list()
Run Code Online (Sandbox Code Playgroud)
请注意,将'=='替换为'<'可以正常工作.
| 归档时间: |
|
| 查看次数: |
8555 次 |
| 最近记录: |