背景:默认情况下,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()]
}
答案 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
发生得太晚,因此我们必须删除sort
和order
,然后在创建强制左连接的别名后手动重新应用它们。
答案 1 :(得分:0)
据我所知g:sortableColumn不依赖于bean对象(在本例中是类User),但使用它的类属性。
property="assignedTo.lastName"
总是必须工作,因为它用于'order by'和'sort'查询语句