Как сделать заказ по более чем одному полю в Grails?

Есть ли способ получить список, упорядоченный по двум полям, скажем, по фамилии и имени?

Я знаю, что .listOrderByLastAndFirst и .list(sort:'last, first') не сработают.


person TheBrain    schedule 28.11.2008    source источник


Ответы (10)


Это старое решение больше не работает. См. ответ Матлари ниже

Возможно, вам придется написать собственный поиск в HQL или использовать Criteria Builder.

MyDomain.find("from Domain as d order by last,first desc")

Or

def c = MyDomain.createCriteria()
def results = c.list {
       order("last,first", "desc")
}
person Hates_    schedule 28.11.2008
comment
Не уверен, почему он был помечен как отрицательный, но первый подход Mydomain.find определенно работает. возможно у него есть опечатка в вышесказанном но это не повод для минуса. +1 от меня. - person saurabh; 17.12.2012
comment
Работал 5 лет назад ;) Жалко не могу удалить. - person Hates_; 05.01.2013
comment
О, как я не люблю, когда люди минусуют то, что раньше работало. - person miek; 22.01.2013
comment
org.hibernate.QueryException: не удалось разрешить свойство: последнее, первое из: MyDomain в grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1616) - person Abdennour TOUMI; 09.10.2013

Ответ на критерий Hates_ мне не помог; упорядочивание "last,first" вызовет только исключения, говорящие, "Property 'last,first' not found". Чтобы заказать на два поля, вы можете сделать следующее:

def c = MyDomain.createCriteria()
def results = c.list {
    and{
       order('last','desc')
       order('first','desc')
    }
}
person mattlary    schedule 27.10.2009
comment
здесь нужен блок "и"? - person Akusete; 13.09.2011
comment
@Matt Lachman: Интересно, я думал, что вокруг критерия есть неявный and. Можете ли вы объяснить, что происходит без and? - person Akusete; 28.10.2011
comment
Возможно, я немного поторопился. Я отзываю свой комментарий: grails.1312388 .n4.nabble.com/ - person Matt Lachman; 02.11.2011
comment
Он работает так же без внешнего блока and в Grails 2.3.7. - person James McMahon; 02.06.2014

Это довольно старо, но помогло мне найти подходящее решение. Пример «более чистого» кода с использованием ярлыка withCriteria:

def c = MyDomain.withCriteria {
    and {
        order('last', 'desc')
        order('first', 'desc')
    }
}
person Arnar B    schedule 02.09.2011
comment
На данный момент это определенно самое чистое решение. Я не ожидаю, что мы сможем сделать лучше. - person Jarek Przygódzki; 31.12.2011

Более сложные критерии упорядочения (проверено в Grails 2.1.0)

def c = MyDomain.withCriteria {
    property {
        order('last', 'desc')
    }
    order('first', 'desc')
}

сначала сортируется по MyDomain.property.last, затем по MyDomain.first

person chim    schedule 12.09.2012

Этот запрос работает на основе первого поля. Когда первое поле пустое, оно замыкается вторым полем.

order('last','desc')
order('first','desc')
person Nakul    schedule 04.11.2009

ты можешь это сделать

def results=MyDomain.findAll([sort:"last",order:'desc'],[sort:"first",order:'desc']);

эта строка кода сначала отсортирует результаты из класса домена «MyDomain» сначала по фамилии, а затем по имени человека.

person maq    schedule 29.05.2014

MyDomain.findAll(sort: ['first': 'desc','last':'desc'])

работает с grails-datastore-gorm:6.0.3

person gerrit-hntschl    schedule 04.05.2018
comment
Это решение работало для меня с Grails 4.0.3 и GORM 7.0.4. Вы также можете сделать что-то вроде Person.findByUsername(username, [sort: ['lastName': 'asc', 'firstName': 'asc']]) - person jnunderwood; 31.12.2020

Я думаю, что критерий - лучший выбор, но вы поступили правильно, сначала попытавшись найти. При извлечении объектов домена из GORM правильный порядок попыток: динамический поиск, критерии, HQL.

person Matthew Taylor    schedule 30.11.2008

Если бы вы сортировали списки по содержимому их элементов, вам нужно было бы реализовать компаратор, у которого были бы некоторые умные способности, чтобы вы могли выбирать порядок сортировки на основе нескольких свойств.

Некоторые примеры компараторов в стиле Groovy показаны здесь

Однако, если список, который вы сортируете, возвращается из запроса к базе данных, вам лучше отсортировать его с помощью CrteriaQuery и отсортировать по этому

person j pimmel    schedule 28.11.2008

У меня такая же проблема. Так как мой список не такой большой, я использую groovy sort, так как хочу сортировать по полям связанного домена: CalendarData -> Attraction

def listCalendar (Calendar calendar) {
    respond CalendarData.where {
        calendar == calendar
    }.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}
person Philippe Rostaing-Tayard    schedule 05.07.2018