Как применить сортировку NULLS LAST в Grails/GORM
Я использую запрос Grails DetachedCriteria, и мне нужно получить нулевые значения, упорядоченные последними при сортировке по убыванию. Это против базы данных Oracle.
Основываясь на исследовании, которое я провел до сих пор, в Hibernate нет прямой поддержки, а следовательно, и в Grails:
Grails / Hibernate: как упорядочить по isnull(свойство), чтобы получить значения NULL последними?
а также
https://hibernate.atlassian.net/browse/HHH-2381
Исходя из этого, мне кажется, что мой лучший вариант - расширить класс Order из Hibernate и добавить поддержку NULLS LAST самостоятельно. Следуя этому пути, может ли кто-нибудь дать мне пример того, как это будет раскрыто через Грааля? У меня очень мало опыта работы с Hibernate, поэтому приведенные примеры довольно сложны для подражания.
Альтернативно: есть ли способ в Oracle, чтобы указать сортировку NULLS LAST в определении таблицы, через какое-либо свойство в столбце или тому подобное?
2 ответа
Ниже приведен пример в критериях Grails для сортировки Nulls в конце путем переопределения hibernate addOrder.
def userCriteria = User.createCriteria()
List results = userCriteria.list(max:limit, offset:offset) {
eq("isActive", true)
ilike("firstName",text+"%")
userCriteria.addOrder(Order.asc("firstName").nulls(NullPrecedence.LAST));
}
Вы даже можете иметь это в or
блок. например.
or{
userCriteria.addOrder(Order.asc(USERNAME).nulls(NullPrecedence.LAST));
userCriteria.addOrder(Order.asc(EMAIL).nulls(NullPrecedence.LAST));
userCriteria.addOrder(Order.asc(FIRST_NAME).nulls(NullPrecedence.LAST));
userCriteria.addOrder(Order.asc(LAST_NAME).nulls(NullPrecedence.LAST));
}
Надеюсь, это поможет кому-то, кто ищет меня.
Добавление к тому, что говорил Swapnil. Если вы используете.list()
вызов объекта Criteria, вы можете отформатировать его следующим образом, используяnulls
ключ:
User.where {
// filters here
}.list([
max: 10,
offset: 0,
sort: 'email',
order: 'asc',
nulls: NullPrecedence.FIRST,
])