Mateo
Mateo

Reputation: 193

Grails - sort by the domain relation attribute (using createCriteria())

I have two domain classes with 1:n relationship:

import Action

class Task {    
    Action actionParent
    String taskName
}

and

class Action {
    String actionName
}

I have the list of Tasks where I have the column "Action name", I would like to sort this column by Action.actionName. Now I'm using the createCriteria() method [I need to use it because I have more logic for filtering and sorting...], but I'm able to sort only by "Action.id". This method looks like:

def criteria = Task.createCriteria();
taskList = criteria.list {
    if(parameters.max != null)
        maxResults(parameters.max)
    if(parameters.offset != null)
        firstResult(new Integer(parameters.offset))
    if(parameters.sort != null && parameters.order)
        order(parameters.sort, parameters.order)
}

Is there any way to sort the domain class data by the relationship attributes?

Thanks for any replay,

Mateo

Upvotes: 3

Views: 6160

Answers (4)

roanjain
roanjain

Reputation: 1252

try this

 def tasksList = Task.findAll()
 tasksListSorted = tasksList.sort { it.actionParent.actionName }

you can also do this

 tasksList.sort{
        task1, task2 -> task1.actionParent.actionName.compareToIgnoreCase(task2.actionParent.actionName)

    }

Upvotes: 2

jstricker
jstricker

Reputation: 2180

I know this is an old question, but in my particular situation (wanting to sort on an association's association's field), it worked only when I passed the sort column directly into the list method:

def criteria = Task.createCriteria();
taskList = criteria.list(max: parameters.max, offset: parameters.offset, sort: parameters.sort, order: parameters.order) {
    // Other code here...
}

When I tried to put the ordering information in the closure itself, Hibernate barfed up an exception with a message org.hibernate.QueryException: could not resolve property: [Grails domain relation's relation's field] of: [Grails domain].

Upvotes: 4

Aaron Saunders
Aaron Saunders

Reputation: 33335

if you want to stick with the criteria approach, try something like this. Create an alias to you Action object and then access the property for sorting it

    def criteria = Task.createCriteria()
    def taskList = criteria.list {
        createAlias("actionParent","_action")
        order( "_action.actionName")
    }

Upvotes: 5

mh377
mh377

Reputation: 1836

Have you tried using the listOrderBy* GORM command, so it would be something like

def tasksList = Task.listOrderByActionName()

Upvotes: 2

Related Questions