使用Grails标准获取一个属性的不同结果

时间:2013-08-12 10:21:35

标签: grails hql distinct criteria

从数据库中的域类实例,我想得到最后20条更新的记录但与某个属性不同,在我的例子中是color。我尝试了3种不同的方法,但似乎没有按照我的预期方式工作。

第一种方法:

def corridors = TerminKorridor.findAll([max:20, sort:'lastUpdated', order:"desc"]).color.unique();

有效,但不会返回20个条目

第二种方法:

 def corridors = corridorsCriteria.list{
            distinct("color")
            maxResults(20)
            order("lastUpdated", "desc")
         }

不会删除具有相同颜色的条目。区别不起作用

第三种方法:

def corridors = TerminKorridor.executeQuery("Select distinct a.color from TerminKorridor a order by a.lastUpdated desc",[max:20])

不会删除具有相同颜色的条目,distinct不起作用。

1 个答案:

答案 0 :(得分:1)

所以我认为你的逻辑存在问题。

目标是获取由lastUpdated排序的20种不同颜色的列表。

如果您想要一个不同的列表,则无法通过lastUpdated进行排序。这没有意义。如果您有3个具有相同颜色的项目,那么您将使用lastUpdated进行排序吗?

您必须选择是否获得最后20条记录,然后选择不同的颜色列表,这几乎肯定会导致少于20条记录

OR

您将获得20种不同颜色的列表

你可以用一些代码来做到这一点。

LinkedHashSet<Color> colors = new LinkedHashSet()

try {
    TerminKorridor.findAll([sort:'lastUpdated', order:"desc"]).each {
        if (colors.size() < 20) {
            colors.add(it.color)
        } else {
            throw new GetOutOfHereException()
        }
    }
} catch(GetOutOfHereException e) {
 null
}

通过使用HQL仅加载颜色而不是整个对象

,可以使这更好
TerminKorridor.executeQuery("select t.color from TerminKorridor t order by t.lastUpdated desc").each { ... }