供稿人:许庆洋
Domain类中,hasMany另外一个Domain类时,其集合属性默认为Set类型,也就是无序的,因此,如果用动态表的方式录入数据,重新加载页面进行编辑或者查看时,其顺序总是毫无规律的发生变化。如:
class Foobar {
static hasMany = [items: FoobarItem];
}
class FoobarItem {
static belongsTo = [test: Foobar];
}
// gsp页面:
// <g:each in="${foobar.items}">....
解决这个问题有两种方式。
1、循环数据行时按照某个关键字排序,如序号:
<g:each in="${foobar.items.sort{it.sortorder}}" >..</g:each>
或:
<g:each in="${CollectionUtils.sort(foobar.items, 'asc', 'sortorder'}" >..</g:each>
2、上面自定义排序的方式虽然能让每次显示顺序都保持一致,但是如果并没有可用于排序的字段,或者需要和录入顺序完全保持一致,可以使用 List 来代替 Set 集合,如:
class Foobar {
List<FoobarItem> items;
static hasMany = [items: FoobarItem];
}
// gsp页面中可以自动排序:
// <g:each in="${foobar.items}">....
不过,使用 List 集合来保存子表数据时,数据库中子表里会生成一个数字类型的 idx 字段用于保存序号,如 items_idx,增删数据时必然会带来一定的开销,因此不适合 hasMany 大量数据的情况。