1

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 ページ目を見ると、特定の人のリストが表示されます。結果の 4 ページ目をリロードすると、わずかに異なるリストが表示されます。8 人分シフトされています。

なぜ一貫性のない結果が得られるのか、誰にも分かりますか? 結果の 4 ページ目を表示するたびに、同じ 100 人が得られると予想します (推測できない場合は、人々の名前を表示しています)。「オフセット」、「最大」、および「並べ替え」の値は、両方の要求で同じです。

どんな助けでも大歓迎です。ありがとう、

アンドリュー

アップデート....

例外が発生する場合を除いて、これはより簡単な方法です。「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: [list] への呼び出しはここではサポートされていません

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

ClientContactController$_closure21_closure39_closure44.doCall で (ClientContactController:494)

4

1 に答える 1

0

異なるリクエスト間で並べ替えが一貫していない理由はわかりませんが、コードの「デフォルト」の grails アプローチを示したいと思います。

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」プロパティがあります。

于 2009-03-05T11:07:41.967 に答える