grails list不返回all,即使没有指定max / offset,也在g:sortableColumn中

时间:2011-11-09 16:25:07

标签: grails

背景:默认情况下,g:sortableColumn标记调用控制器中的列表操作,并向其传递一个“sort”参数,该参数指示要排序的字段。在我的具体情况下,我有一个我正在排序的问题类/列表:

 class Issue {
     String title 
          ...
     User assignedTo
          ...
  }

 Class User {
    String lastName
     ...
 }

指定g:sortableColumn property =“assignedTo.lastName”,它转换为列表的sort参数,如果已分配问题,则工作得很好 - 即assignedTo为非null。但如果没有,则list()不再返回它。我不知道这是不是list()的错误(注释?),但是我想把那些带有null赋值的问题放在最后。

我考虑过将Issue.list()与Issue.findAllByAssignedToIsNull()结合起来,但它需要在两者中协调max / offset,如果可能的话我宁愿避免。

思想/评论?

-------每条评论------

这是标准(Grails 1.3.7)脚手架列表操作,即:

   def list = {
    params.max = Math.min(params.max ? params.int('max') : 10, 100)
    [issueInstanceList: Issue.list(params), issueInstanceTotal: Issue.count()]
}

-----每秒评论(我的)------------------------------------ ----

我还尝试了以下内容,它再次没有返回assignTo为null的问题:

 <g:sortableColumn property="assignedTo.lastName" title="${message(code: 'issue.assignedTo.label', default: 'Assigned To')}" />

 def list = {
   if (params.sort == 'assignedTo.lastName') {
      println "doing special find/sort by: ${params.sort}"
      return [issueInstanceList: Issue.findAllByAssignedToIsNullOrAssignedToIsNotNull(params), issueInstanceTotal: Issue.count()]
   }
   [issueInstanceList: Issue.list(params), issueInstanceTotal: Issue.count()]
 } 

2 个答案:

答案 0 :(得分:1)

您必须在用户表上强制执行左连接。以下是使用条件查询执行此操作的一种方法:

import org.hibernate.criterion.CriteriaSpecification

...

def list() {
    params.max = Math.min(params.max ? params.int('max') : 10, 100)
    def criteriaParams = [:]
    criteriaParams.putAll(params)
    def sortParam = criteriaParams.remove('sort')
    def orderParam = criteriaParams.remove('order')
    def issueList = Issue.createCriteria().list(criteriaParams) {
        createAlias('assignedTo', 'assignedTo', CriteriaSpecification.LEFT_JOIN)
        if (sortParam) {
            order(sortParam, orderParam)
        }
    }

    [issueInstanceList: issueList, issueInstanceTotal: issueList.getTotalCount()]
}

params传递到条件list()方法会自动处理分页和排序,就像域对象list()方法一样。我们的createAlias发生得太晚,因此我们必须删除sortorder,然后在创建强制左连接的别名后手动重新应用它们。

答案 1 :(得分:0)

据我所知g:sortableColumn不依赖于bean对象(在本例中是类User),但使用它的类属性。

property="assignedTo.lastName"

总是必须工作,因为它用于'order by'和'sort'查询语句