【问题标题】:Getting distinct results for one property with Grails criteria使用 Grails 标准为一个属性获得不同的结果
【发布时间】:2013-08-12 10:21:35
【问题描述】:

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

【问题讨论】:

    标签: grails hql distinct criteria


    【解决方案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 { ... }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2018-06-20
    • 2019-04-14
    • 2019-12-23
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多