Результаты пейджинга Grails противоречивы - PullRequest
0 голосов
/ 04 марта 2009

Я делаю пейджинг в своем приложении Grails. Так как я делаю некоторую специальную сортировку, я не могу использовать удобные методы сортировки / разбивки на страницы. Вот мой код подкачки на стороне сервера:

def criteria = ClientContact.createCriteria().createAlias("client", "c")
criteria.setFirstResult(params.offset?.toInteger())
criteria.setMaxResults(params.max?.toInteger())
def sortField = params.sort
if(params.sort == "clientName") sortField = "c.name"
criteria.addOrder(params.order == "asc" ? Order.asc(sortField) : Order.desc(sortField))
            /*
            if(!StringUtils.isBlank(params.searchField))
            {
                criteria.add(
                    Restrictions.or (
                        Restrictions.ilike("c.name", "%" + params.searchField + "%"),
                        Restrictions.or(
                            Restrictions.ilike("firstName", "%" + params.searchField + "%"),
                            Restrictions.ilike("lastName", "%" + params.searchField + "%")
                        )
                    )
                )
            }
                */

def results = criteria.list()

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

Когда я смотрю на 4-й странице своих результатов, я вижу определенный список людей. Когда я перезагружаю четвертую страницу результатов, я вижу немного другой список, смещенный на 8 человек.

Кто-нибудь знает, почему я получаю противоречивые результаты? Я ожидаю, что получу одни и те же 100 человек каждый раз, когда просматриваю четвертую страницу своих результатов (если вы не догадались, я показываю имена людей). Значения 'offset', 'max' и 'sort' идентичны для обоих запросов.

Любая помощь приветствуется. Спасибо,

Andrew

Обновление ....

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

            if(params.sort == 'client') params.sort = 'c.name'
            def criteria = ClientContact.createCriteria()
            criteria.createAlias('client', 'c')
            def pagedResults = criteria.list(offset: params.offset, max: params.max, sort: params.sort, order: params.order ?: 'asc' ) {
                    if(!StringUtils.isBlank(params.searchField)) {
                            or {
                                            ilike "c.name", "%$params.searchField%"
                                            ilike "firstName", "%$params.searchField%"
                                            ilike "lastName", "%$params.searchField%"
                            }
                    }
            }

Исключение:

Вызвано: java.lang.IllegalArgumentException: вызов [список] не поддерживается здесь

в grails.orm.HibernateCriteriaBuilder.invokeMethod (HibernateCriteriaBuilder.java:847)

в ClientContactController $ _closure21_closure39_closure44.doCall (ClientContactController: 494)

1 Ответ

0 голосов
/ 05 марта 2009

У меня нет идеи, почему сортировка несовместима между разными запросами, но я хотел бы показать вам подход по умолчанию для вашего кода:

if(params.sort == 'clientName') params.sort = 'c.name'
def criteria = ClientContact.createCriteria()
criteria.createAlias('client', 'c')
def results = criteria.list( sort: params.sort, order: params.order ?: 'asc' ) {
    if(!StringUtils.isBlank(params.searchField)) {
        or {
            ilike "c.name", "%$params.searchField%"
            ilike "firstName", "%$params.searchField%"
            ilike "lastName", "%$params.searchField%"
        }
    }
}

переменная результатов является экземпляром PagedResultList, который в основном является обычным списком, но имеет свойство totalCount для упрощения подкачки.

...