Grails:尝试对列表进行排序时更新数据

时间:2014-04-04 14:58:56

标签: grails

我一直面临着以下代码块以奇怪的方式表现的情况。在下面的代码片段中,当我尝试在我的taglib中对案例工作流的活动列表进行排序时,它执行db update而不是仅仅排序数据。它会更新工作流行的版本。 你能告诉我我错过了什么吗? 非常感谢快速帮助。

TagLib:

class CaseFormTagLib { 
     static namespace = 'caseform' 

    def caseForm = { attr, body -> 
            def caseWorkflow = CaseWorkflow.read(attr.workflowId) 

            //Line causing issue
            def activityList = caseWorkflow?.sortedActivityList  
    } 
}

域名:

class CaseWorkflow { 
    List caseActivityList 
    static hasMany = [caseActivityList: CaseActivity] 

    @Transient 
    def getSortedActivityList(){ 
            Collections.sort(this.caseActivityList) 
            return this.caseActivityList 

    } 
} 

class CaseActivity implements Comparable { 
    /** 
     * Activity Id 
     */ 
    Integer activityId 

    @Override 
    public int compareTo(obj) { 
            if(!obj || !obj.activityId) { 
                    return 1 
            } else if (!this.activityId) { 
                    return -1 
            } else { 
                    return this.activityId.compareTo(obj.activityId) 
            } 
    } 
}

1 个答案:

答案 0 :(得分:0)

此行为是因为taglib中使用的read()。除非对其关联进行更改,否则read()不会自动flush域到数据库。

在这种情况下,由于您要对关联进行排序,因此会对其进行脏检查 关联,最后自动刷新对象。通过以上链接阅读说明,主要是:

  

但是有一个例外 - 任何相关的集合,   例如,作者的书籍集将参加   自动冲洗和脏污检测。这是因为映射   集合的处理方式与常规属性不同   独立于包含域管理自己的脏检查   类。

此外,默认情况下,关联是域类中的Set。如果您希望对关联进行排序,那么您可以使它们SortedSet使Comparable的工作方式与您为CaseActivity定义的方式相同:

class CaseWorkflow { 
    SortedSet caseActivityList 
    static hasMany = [caseActivityList: CaseActivity] 
} 

是否必须使用List

对其编制索引