我有一个看起来像这样的表:
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
预期结果:
id name value date_created ---- ----- ------ --------- 3 Red <null> 10-24-2013 4 Orange light 10-24-2013
我该如何使用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
我尝试过的
def c = Color.createCriteria() def results = c { projections { groupProperty("name") max("dateCreated") } }
但是我不知道如何从投影中获取更多列?即shade列
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" } }
DetachedCriteria该类的显式使用有点丑陋,但还算不错。该查询也可以作为Where查询使用,但是似乎存在一个错误,这意味着您不能对聚合函数使用’==’。修复错误后,您应该可以执行以下操作:
DetachedCriteria
def colors = Color.where { dateCreated == max(dateCreated) }.property("name").property("shade").property("dateCreated").list()
请注意,用’<’替换’==’可以正常工作。