Сортировка по пустым полям в GORM

Я пытаюсь понять, как сортировать по нескольким полям в Grails 3, одно из которых может быть или не быть нулевым. У меня есть этот Книжный домен:

class Book {

    String title
    String sortTitle

    static constraints = {
        title blank: false
        sortTitle nullable: true
    }
}

Книги с такими названиями, как «Периферийное устройство», имеют sortTitle «Периферийное устройство», иначе sortTitle будет нулевым. Я хочу, чтобы книги были отсортированы по sortTitle, если таковой существует, в противном случае по title.

Я нашел другие похожие вопросы SO, но ни одного с полем, допускающим значение NULL. У кого-нибудь есть указатели в правильном направлении?


person Johan Svensson    schedule 10.06.2015    source источник


Ответы (3)


Вы можете использовать:

coalesce(book.sortTitle, book.title)

Здесь у вас есть официальная Документация по гибернации.

person David Chavez    schedule 10.06.2015

Я не уверен в этом на 100%, но мне кажется, что сортировка с помощью объединения приведет к тому, что база данных будет выполнять сортировку файлов, что может быть довольно дорогостоящим, чем возможность использовать индекс.

Я предлагаю всегда заполнять sortTitle именем, которое вы хотите отсортировать, а затем просто использовать его.

person TimJ    schedule 10.06.2015
comment
Да, я думал о влиянии БД. Это просто упражнение по изучению Grails, и я хотел решить эту конкретную проблему, но для живого производственного приложения я бы, вероятно, просто установил sortTitle на значение title, если sortTitle оставлено пустым при создании объекта. - person Johan Svensson; 11.06.2015

Я не мог понять, как это сделать чисто с помощью GORM, но какой-то необработанный HQL работал:

def books = Book.findAll("from Book as b order by coalesce(b.sortTitle, b.title)")
person Johan Svensson    schedule 10.06.2015