我有一对多的关系。
我有一个应用程序,它有多个文件可以上传到它。 “应用程序”视图包含“上载的文件”列表(列表中的文件只包含有关文件的元数据,如文件名,文件大小等)。我无法对嵌套列表进行排序
我正在使用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中,将SQL数据中的元数据存储在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标记来调用控制器中的排序操作
<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的集合进行排序,但是我不断收到违规行为,因为它们是附加到DB的对象。
我也可以重新检索已排序的列表,但我不确定你是如何指定你想要一个动态排序的嵌套对象从数据库中检索它(我知道必须有一个简单的方法来做到这一点,但我很新Grails的)。
我想知道如何以两种方式进行,以备将来参考。
答案 0 :(得分:0)
您可以创建一个简单的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