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
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")
}
Have you tried using the listOrderBy* GORM command, so it would be something like
def tasksList = Task.listOrderByActionName()
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]
.
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)
}