Сортировка списка по параметру URL (или сортировка модели вложенного домена в запросе) - PullRequest
1 голос
/ 25 марта 2012

Я уверен, что есть способ сделать это, но я действительно застрял на этом.

У меня есть модель домена, которая соединяется с сущностями Foo и Bar во многих-в-много-отношений.Теперь, когда я хочу перечислить все Foos для определенного бара, я делаю запрос и получаю много FooBar объектов.Я перебираю эти объекты и добавляю все Foo s в список.

Примерно так:

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

Как мне отсортировать fooList на основе параметров a g:sortableColumnдобавляет к URL, а именно sort (поле для сортировки) и order.

Я знаю, что вы можете передать параметры в запрос напрямую, но я думаю, что это невозможно в моем случае?

Так как же я могу

  1. Сделать один запрос без итерации списка, чтобы я мог передать параметры сортировки ИЛИ
  2. Сортировать свой список попараметры сортировки?

Добавление 1 (25.03.2012)

Если бы я мог к этому ...

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

... проблемабудет решена.Но передача этого в запрос не влияет на вывод.Можно ли как-то отсортировать запрос по подсвойству?

1 Ответ

0 голосов
/ 25 марта 2012

Если вы действительно не можете сортировать внутри самого запроса. Тогда вам нужен список списков.

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

Затем используйте Comparator, чтобы отсортировать список> по требуемому полю. Скажите, что ваше желаемое поле имеет индекс 3:

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

UPATE НА ОСНОВЕ КОММЕНТАРИИ:

скажем, ваша сущность выглядит следующим образом

* * 1010

Тогда

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» для сортировки

...