Как сделать заказ по нескольким полям в Grails?
-
11-07-2019 - |
Вопрос
Есть ли способ получить список, упорядоченный по двум полям, например, фамилии и имени?
Я знаю .listOrderByLastAndFirst
и .list(sort:'last, first')
не сработает.
Решение
Это старое решение больше не работает.Пожалуйста, смотрите ответ Мэттлари ниже
Возможно, вам придется написать собственный поисковик на HQL или использовать Criteria Builder.
MyDomain.find("from Domain as d order by last,first desc")
Или
def c = MyDomain.createCriteria()
def results = c.list {
order("last,first", "desc")
}
Другие советы
Hates_ критерий ответа, похоже, не работает для меня; приведение в порядок < last & first "
приведет только к исключениям: " свойство 'last, first' not found "
. Чтобы сделать заказ на два поля, вы можете сделать следующее:
def c = MyDomain.createCriteria()
def results = c.list {
and{
order('last','desc')
order('first','desc')
}
}
Это довольно старое, но помогло мне найти подходящее решение. «Очиститель» Пример кода с использованием ярлыка 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')
Я думаю, что критерий - лучшая ставка, но вы поступили правильно, пытаясь сначала найти искатель. При извлечении доменных объектов из GORM правильный порядок действий: динамический поиск, критерии, HQL.
вы можете сделать это
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
Если бы вы сортировали списки по содержимому их элементов, вам нужно было бы реализовать компаратор, у которого было бы несколько смартов, чтобы вы могли выбирать порядок сортировки на основе нескольких свойств. Р>
Некоторые примеры компараторов Groovy представлены здесь здесь а> р>
Однако, если сортируемый вами список возвращается из запроса к базе данных, вам лучше отсортировать его с помощью CrteriaQuery и отсортировать по нему
У меня та же проблема. Поскольку мой список не такой большой, я использую сортировку groovy, так как хочу сортировать по полям связанного домена: CalendarData - > Аттракцион
def listCalendar (Calendar calendar) {
respond CalendarData.where {
calendar == calendar
}.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}