基于URL参数对列表进行排序(或在查询中对嵌套域模型进行排序)

时间:2012-03-24 23:06:24

标签: list grails grails-2.0

我确信有办法做到这一点,但我真的坚持这个。

我有一个以多对多关系连接到实体FooBar的域模型。现在,当我想将所有Foos列入某个Bar时,我会进行查询并获得大量FooBar个对象。我遍历这些对象并将所有Foo添加到列表中。

像这样:

def fooBarRelations = FooBar.findAllByBar bar
def fooList = []
fooBarRelations.each { fooList.add it.foo }

如何根据fooList添加到网址g:sortableColumn(要排序的字段)和sort的参数对order进行排序。

我知道你可以直接将参数传递给查询,但我觉得这在我的情况下是不可能的?

那我怎么能

  1. 在没有列表迭代的情况下进行一次查询,这样我就可以传递排序参数 OR
  2. 根据排序参数对自定义列表进行排序?
  3. 加法1(03/25/2012)

    如果我能做到这一点......

    def fooBarRelations = FooBar.findAllByBar bar, [sort: 'foo.' + params.sort, order: params.order]
    

    ......问题将得到解决。但将此传递给查询对输出没有任何影响。有什么办法可以按子属性对查询进行排序吗?

1 个答案:

答案 0 :(得分:0)

如果你真的无法在查询本身内进行排序。然后你需要一个列表列表。

List<List<Fields>> mylist;// where List<Fields> is a lists of the fields.

然后使用比较器对List进行排序&gt;通过所需的提交。假设您想要的字段位于索引3:

 new Compare(List<Fields> L1, List<Fields> L2){
     if(L1.get(3)>L2.get(3))
          return -1;//etc.

根据评论进行更新:

说你的实体如下

public class Entity{
    String name, address, school;
    Integer bankaccount;
    //etc...
}

然后

public class WhereISort{
    List<Entity> myList;
    String mysorter;//mysorter can be declared here as static final
    public WhereISort(){//maybe pass list in here or whatever
    }

    public Response myWebService(params..., String sorter){
       mysorter=sorter;//mysorter can be declared here as static final
       Collections.sort(myList, new Comparator() {
        public int compare(Entity e1, Entity e2) {
            if(mysorter.equalsIgnoreCase("name")){
               return e1.getName().compareToIgnoreCase(e1.getName());
            }else if(mysorter.equalsIgnoreCase("bankaccount")){
                //your code here, etc.
            }
        }
      });
    }
}

当然,重点是使用“mysorter”和内部类“Comparator”来排序