简体   繁体   中英

Getting distinct results for one property with Grails criteria

From a domain class instance in the database I want to get the last 20 updated records but distinct to a certain property, which in my case is color . I've tried 3 different approaches but none seem to work the way I expected.

First approach:

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

works but doesn't return 20 entries

Second approach:

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

doesn't remove entries with same colors. Distinct doesn't work

Third approach:

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

doesn't remove entries with same colors, distinct doesn't work.

So I think there is a problem with your logic somewhere here.

The goal is to get a list of 20 distinct colors ordered by lastUpdated.

You cant order by lastUpdated if you want a distinct list. It doesn't make sense. If you have 3 items with the same color, which lastUpdated would you use to do the ordering?

You have to choose if you are getting the last 20 records and then a distinct list of colors, which would almost certainly result in less than 20 records

OR

You get a list of 20 distinct colors

You could do this with some code though.

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
}

You could make this better by using HQL to only load the colors instead of the entire objects

TerminKorridor.executeQuery("select t.color from TerminKorridor t order by t.lastUpdated desc").each { ... }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM