假设我有两个域对象,即文档和作者
Class Document {
Author author
String title
}
Class Author {
String lastName
String firstName
String toString() {
return lastName + ", " + firstName
}
}
视图list.gsp看起来像这样:
<g:sortableColumn property="title" title=... />
<g:sortableCOlumn property="author" title=... />
....
<td>${fieldValue(bean: documentInstance, field: "author"}></td>
<td>${fieldValue(bean: documentInstance, field: "title"}></td>
表中显示的值按预期工作 - 表行将在documentInstance.title旁边显示作者(lastName,firstName)。
但是,单击“作者”列标题进行排序会导致“文档”按author.id排序。
最有效的方法是通过author.toString()或“author.lastName,author.firstName”进行排序,而不是按author.id进行排序?
如果可能的话,我宁愿避免回到.withCriteria {} - 我有四个不同的列需要这个功能,而且看起来会变得混乱。
答案 0 :(得分:3)
您可以使用derived property创建要排序的虚拟列:
Class Author {
String lastName
String firstName
String sortingName
static mapping {
// modify the SQL formula to use your DB's concatenation operator
sortingName formula: "`LAST_NAME` || ',' || `FIRST_NAME`)" // Standard SQL
}
String toString() { sortingName }
}
然后将列设置为sortingName
:
<g:sortableColumn property="author.sortingName" title=... />
(我在这里猜测,但我认为这应该有效。)
答案 1 :(得分:2)
我只是Grails的初学者,所以也许我的答案不是最佳的,但这对我来说是最简单的方法:
我使用Document.list(params)
而不是Document.findAll()
。值得一提的是,在我的应用程序中,我确实需要在我的列表中使用某种过滤器,因此findAll()
是最好的方法。无论如何,我会这样做:
Document.findAll( "from Document as d order by d." + params.sort + ' ' + params.order, params ) //supports pagination
在视图中:
<g:sortableCOlumn property="author.lastName" title=... />