动态表如何排序?
李小翔
2014-06-17 14:55

内容列表

供稿人：许庆洋
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 大量数据的情况。