Как заказать более одного поля в Grails? - PullRequest
39 голосов
/ 28 ноября 2008

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

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

Ответы [ 10 ]

81 голосов
/ 28 октября 2009

Hates_ критерий ответа, похоже, не работает для меня; приведение в порядок "last,first" вызовет только исключения: 1004 *. Для заказа на два поля вы можете сделать следующее:

def c = MyDomain.createCriteria()
def results = c.list {
    and{
       order('last','desc')
       order('first','desc')
    }
}
9 голосов
/ 02 сентября 2011

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

def c = MyDomain.withCriteria {
    and {
        order('last', 'desc')
        order('first', 'desc')
    }
}
8 голосов
/ 28 ноября 2008

Это старое решение больше не работает. Пожалуйста, смотрите ответ Матлари ниже

Возможно, вам придется написать собственный искатель на 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")
}
5 голосов
/ 12 сентября 2012

Более сложные критерии заказа (проверено в Grails 2.1.0)

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

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

4 голосов
/ 04 ноября 2009

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

order('last','desc')
order('first','desc')
3 голосов
/ 29 мая 2014

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

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

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

3 голосов
/ 30 ноября 2008

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

2 голосов
/ 04 мая 2018
MyDomain.findAll(sort: ['first': 'desc','last':'desc'])

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

0 голосов
/ 05 июля 2018

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

def listCalendar (Calendar calendar) {
    respond CalendarData.where {
        calendar == calendar
    }.list().sort{ "$it.attraction.type?:' '$it.attraction.name" }
}
0 голосов
/ 28 ноября 2008

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

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

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

...