2010-08-01 31 views
1

我有两个域类与1:n的关系:的Grails - 排序域关系属性(使用个createCriteria())

import Action 

class Task {  
    Action actionParent 
    String taskName 
} 

class Action { 
    String actionName 
} 

我有任务,其中的列表我有“Action name”这一列,我想通过Action.actionName对这个列进行排序。现在我正在使用createCriteria()方法[我需要使用它,因为我有更多的逻辑来筛选和排序...],但是我只能通过“Action.id”进行排序。此方法看起来像:

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) 
} 

有没有什么办法可以通过关系属性对域类数据进行排序?

感谢您的重播,

回答

1

您是否尝试过使用listOrderBy *格姆命令,所以它会像

def tasksList = Task.listOrderByActionName() 
4

,如果你想坚持的标准方法,尝试这样的事情。创建一个别名,你行动的对象,然后访问属性分类整理

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

替代无别名: '高清TASKLIST = {criteria.list actionParent { 顺序( “actionName”) } }' – 2012-01-08 15:37:09

2

我知道这是一个老问题,但在我的特殊情况(想排序关联的协会的字段),它只有在工作我直接传送排序列进名单的方法:

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

当我试图把盖子本身的订购信息,休眠barfed了一个例外,与消息org.hibernate.QueryException: could not resolve property: [Grails domain relation's relation's field] of: [Grails domain]

+0

谢谢,您的解决方案为我工作。有同样的问题。 – Slavak 2015-05-07 06:39:31

2

试试这个

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

,你也可以做到这一点

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

    }