带有多个字段的Grails sortableColumn

时间:2012-04-15 15:37:51

标签: grails

假设我有两个域对象,即文档和作者

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 {} - 我有四个不同的列需要这个功能,而且看起来会变得混乱。

2 个答案:

答案 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=... />