2012-08-02 19 views
5

私はドメイン "country"を持っており、list.gspには入力欄がある検索ブロックがあります。 最初の問題は、私のリストにページトップを使用しようとしたときに、常にすべての結果を示していました。この場合は解決策を得て、表示するために10個の値を送信しました。grails検索結果のページ区切り

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> 

...... ......

+0

Emmmm、なぜ検索エンジンを使用して、後でHQLクエリを使用しますか? –

答えて

1

あなたは、テーブル内の行の非常に多くを持っている場合は、このような改ページは中断します。中規模のテーブルであっても、データベースからすべての行にロードされるため、かなり遅くなります。

よりよい解決策は、クエリでページ番号付けを行うことです。あなたは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]) 

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

最後に、オフセットをパラメータとして渡す必要があります。 Grailsにはあなたのためにすべてを扱うタグがあります:g:paginate

+0

それは動作しません、私はexecuteQueryを意味する、私はエラーNullを持って –

+0

余分なパラメータなしで動作しますか? – ataylor

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}"/> 

が完了exampleを参照してください。

+0

私は 'params =" $ {params} "を使うように思い出させるために+1しました。なぜ私がページ間で自分のparamsを失っているのか不思議でした –

0

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

<g:paginate total="${resultTotal}" action="list" params="${params}"/> 
関連する問題