1

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

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

像这样:

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

如何fooList根据g:sortableColumn添加到 url 的参数(即sort(要排序的字段)和order.

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

那我怎么能

  1. 在没有列表迭代的情况下进行一个查询,以便我可以传入排序参数
  2. 根据排序参数对我的自定义列表进行排序?

添加 1 (03/25/2012)

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

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

...问题将得到解决。但是将其传递给查询不会对输出产生任何影响。有什么方法可以按子属性对查询进行排序?

4

1 回答 1

0

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

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

然后使用比较器按所需的字段对您的 List> 进行排序。假设您想要的字段位于索引 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”进行排序

于 2012-03-24T23:29:05.190 回答