簡體   English   中英

Grails:對嵌套域對象進行排序

[英]Grails: Sorting Nested Domain Objects

我有一對多的關系。
我有一個可以將多個文件上傳到其中的應用程序。 “應用程序”視圖包含“上載的文件”列表(列表中的文件僅包含有關文件的元數據,例如文件名,文件大小等)。 我無法對嵌套列表進行排序。
我正在使用sortableColumn在控制器中調用排序操作。
如何檢索應用程序,並指定按請求的屬性(例如文件名,文件大小等)對上傳文件的嵌套列表進行排序

編輯:
以下是一些摘要:

這是應用程序域對象

class Application implements Serializable {

    private static final long serialVersionUID = 1

    Firm firm

    static hasMany = [applicationDocumentHolders:ApplicationDocumentHolder]

    static belongsTo = [firm:Firm]
    static mapping = {firm lazy: false}
}

這是應用程序文檔保存器(我將實際文檔存儲在MongoDB中,將元數據存儲在SQLServer中的applicationDocumentHolder對象中,因此為了簡單起見,我將文檔文件省略了,因為它與該問題無關)

import java.sql.Time

class ApplicationDocumentHolder implements Serializable {

    private static final long serialVersionUID = 1

    static belongsTo = [application:Application]

    static mapping = {application lazy: false}

    Application application
    ApplicationDocumentType type
    ApplicationDocumentStatus status
    Date verfiedDate
    Long uploadFileId
    //Following fields will be null until a file is uploaded
    String fileName
    Date uploadDate
    String uploadUserId
    long fileSize

    static constraints = {
        type blank: false
        status blank: false
        verfiedDate nullable: true
        uploadFileId nullable: true
        uploadFile nullable: true
        fileName nullable: true
        uploadDate nullable: true
        uploadUserId nullable: true
        fileSize nullable: true
    }
}

這是GSP的一個片段,我在其中使用sortableColumn標記在控制器中調用sort操作

<g:sortableColumn action="sort" property="type" title="${message(code: 'applicationDocumentHolder.type.label', default: 'Type')}" />

<g:sortableColumn action="sort" property="status" title="${message(code: 'applicationDocumentHolder.status.label', default: 'Status')}" />

<g:sortableColumn action="sort" property="verfiedDate" title="${message(code: 'applicationDocumentHolder.verfiedDate.label', default: 'Verfied Date')}" />

<g:sortableColumn action="sort" property="fileName" title="${message(code: 'applicationDocumentHolder.uploadFileName.label', default: 'Upload File Name')}" />

我想知道這樣做的最好方法是什么。
我可以在控制器中對ApplicationDocumentHolders的集合進行排序,但是我不斷收到違規信息,因為這些違規是附加到數據庫的對象。
我還可以重新檢索排序后的列表,但是我不確定從數據庫中檢索到動態排序的嵌套對象時該如何指定(我知道必須有一種簡單的方法來做到這一點,但是我很陌生grails)。

我想知道如何同時使用這兩種方法,以供將來參考。

您可以創建一個簡單的Closure,並接受要排序的屬性和文件。 然后,您可以關閉該Closure的Closure.curry(attributeName),以獲取一個按該屬性排序的新Closure。 然后,將Closure傳遞給Collection.toSorted()以對文件列表進行排序。

def files = [
    [name: 'foo.txt', size: 10],
    [name: 'bar.txt', size: 30],
    [name: 'hello.txt', size: 20]
]

def sorter = { attr, file -> file[attr] }

files.toSorted sorter.curry('size') // sort by size
files.toSorted sorter.curry('name') // sort by name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM