1

从数据库中的域类实例中,我想获取最近 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不起作用。

4

1 回答 1

1

所以我认为你的逻辑在这里的某个地方有问题。

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

如果你想要一个不同的列表,你不能按 lastUpdated 排序。这没有意义。如果您有 3 件颜色相同的商品,您会使用哪个 lastUpdated 进行订购?

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

或者

你会得到一个包含 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 { ... }
于 2013-08-12T14:06:11.767 回答