Есть ли способ получить список, упорядоченный по двум полям, скажем, по фамилии и имени?
Я знаю, что .listOrderByLastAndFirst и .list(sort:'last, first') не сработают.
Есть ли способ получить список, упорядоченный по двум полям, скажем, по фамилии и имени?
Я знаю, что .listOrderByLastAndFirst и .list(sort:'last, first') не сработают.
Это старое решение больше не работает. См. ответ Матлари ниже
Возможно, вам придется написать собственный поиск в 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")
}
Ответ на критерий Hates_ мне не помог; упорядочивание "last,first" вызовет только исключения, говорящие, "Property 'last,first' not found". Чтобы заказать на два поля, вы можете сделать следующее:
def c = MyDomain.createCriteria()
def results = c.list {
and{
order('last','desc')
order('first','desc')
}
}
and. Можете ли вы объяснить, что происходит без and?
- person Akusete; 28.10.2011
and в Grails 2.3.7.
- person James McMahon; 02.06.2014
Это довольно старо, но помогло мне найти подходящее решение. Пример «более чистого» кода с использованием ярлыка withCriteria:
def c = MyDomain.withCriteria {
and {
order('last', 'desc')
order('first', 'desc')
}
}
Более сложные критерии упорядочения (проверено в Grails 2.1.0)
def c = MyDomain.withCriteria {
property {
order('last', 'desc')
}
order('first', 'desc')
}
сначала сортируется по MyDomain.property.last, затем по MyDomain.first
Этот запрос работает на основе первого поля. Когда первое поле пустое, оно замыкается вторым полем.
order('last','desc')
order('first','desc')
ты можешь это сделать
def results=MyDomain.findAll([sort:"last",order:'desc'],[sort:"first",order:'desc']);
эта строка кода сначала отсортирует результаты из класса домена «MyDomain» сначала по фамилии, а затем по имени человека.
MyDomain.findAll(sort: ['first': 'desc','last':'desc'])
работает с grails-datastore-gorm:6.0.3
Person.findByUsername(username, [sort: ['lastName': 'asc', 'firstName': 'asc']])
- person jnunderwood; 31.12.2020
Я думаю, что критерий - лучший выбор, но вы поступили правильно, сначала попытавшись найти. При извлечении объектов домена из GORM правильный порядок попыток: динамический поиск, критерии, HQL.
Если бы вы сортировали списки по содержимому их элементов, вам нужно было бы реализовать компаратор, у которого были бы некоторые умные способности, чтобы вы могли выбирать порядок сортировки на основе нескольких свойств.
Некоторые примеры компараторов в стиле Groovy показаны здесь
Однако, если список, который вы сортируете, возвращается из запроса к базе данных, вам лучше отсортировать его с помощью CrteriaQuery и отсортировать по этому
У меня такая же проблема. Так как мой список не такой большой, я использую groovy sort, так как хочу сортировать по полям связанного домена: CalendarData -> Attraction
def listCalendar (Calendar calendar) {
respond CalendarData.where {
calendar == calendar
}.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}