从数据库中的域类实例,我想得到最后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
不起作用。
答案 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 { ... }