Как сделать заказ по нескольким полям в Grails?

StackOverflow https://stackoverflow.com/questions/326053

  •  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" }
}
scroll top