5

ドメイン「国」があり、list.gsp に入力フィールドのある検索ブロックがあります。最初の問題は、リストで paginate を使用しようとしたときに常にすべての結果が表示されたときでした。私の検索は次のようになります。

    def search = {
       if(query){
           def srchResults = searchableService.search(query, params)

           def result =  Country.executeQuery("select  new map(a.name as name, a.datacenter as datacenter) from Country a where a.name like '%"+ params.q + "%'")

           if (params.offset)
           {
               x = params.offset.toInteger()
               y = Math.min(params.offset.toInteger()+9, result.size()-1)
           } else
            {
            x = 0
            size = result.size() - 1
            y = Math.min(size, 9)
             }     
           def q=params.q

          [countryInstanceList: result.getAt(x .. y), countryInstanceTotal:result.size(), q:params.q]

       }else{
           redirect(action: "list")
       }
   }

次のページを押すと、検索フィールドからのパラメーターがクリーニングされ、結果がnullになります。フィールド値をパラメーターとして送信しようとしましたが、何か間違ったことをしています。

私の検索ページは次のようになります。

<g:form action="search">
            <div class="search" >
                Search Country
                <g:hiddenField name="q" value="${params.q}" />
                <input type="text" name="q" value="${params.q}" />
                <input type="submit" value="Search"/>
            </div>
        </g:form>

…………

4

3 に答える 3

2

私が見つけた最良の解決策:

アクションの場合:

def list() {
... //use params to filter you query and drop results to resultList of type PagedResultList
return [resultList: resultList, resultTotal: resultList.getTotalCount(), filterParams: params]
}

ビューの場合:

<g:paginate total="${resultTotal}" action="list" params="${filterParams}"/>

完全なを参照してください。

于 2015-02-03T00:02:43.903 に答える
1

テーブルに非常に多くの行がある場合、このようなページネーションは壊れます。中規模のテーブルでも、データベースからすべての行をロードするため、かなり遅くなります。

より良い解決策は、クエリでページネーションを行うことです。へのオプションの 3 番目の引数として、ページネーションのクエリ パラメータのマップを渡すことができますexecuteQuery

def maxResults = 10
def result = Country.executeQuery(
    "select  new map(a.name as name, a.datacenter as datacenter) from Country a where a.name like ?", 
    [params.q], 
    [max: maxResults, offset: params.offset])

また、フォームには name の 2 つのフィールドがありますq。テキスト入力と同じ名前の隠しフィールドを使用しないでください。テキスト入力のデフォルト値は、属性で指定できvalueます。

最後に、オフセットをパラメーターとして渡す必要があります。Grails には、これらすべてを処理するタグがあります: g:paginate.

于 2012-08-02T14:41:39.670 に答える
0

params 属性に params オブジェクトを追加します。

<g:paginate total="${resultTotal}" action="list" params="${params}"/>
于 2015-07-08T20:58:03.810 に答える