2012-03-01 7 views
2

約100行の結果を返すクエリがあります。ここにコントローラのコードがありますGrailsページネーション:ページ数を使用して行数を制限する方法

def bandsOneTrack = { 
    def bands = Band.executeQuery("Select b from Band as b where size(b.tracks) > (select count(t.id) from Band as ba join ba.tracks as t where ba.id = b.id and t.ourContract is not null) and (select count(t.id) from Band as ba join ba.tracks as t where ba.id = b.id and t.ourContract is not null) >= 1") 
    render(view: 'bands_list' , model: [ bands : bands ]) 
} 

それは私に約100行の結果セットを与えますが、それらは同じページの中に現れています。 ページ単位で20行に制限できるように、ページネーションを使用したいと思います。 私は何をすればよいのでしょうか、またこれにページネーションを使う方法もあります。

答えて

7

あなたのページネーションのタグには、全パラメータを確認してください。それはレコードの総数でなければなりません。あなたのケース100では、ページネーションタグが総ページ数を計算できるようにします。 hereこのような

何か:あなたは一度クエリを実行するレコードの合計数を確認する必要があるかもしれません

<g:paginate controller="Book" action="list" total="${bookInstanceTotal}" /> 

def list() { 
    params.max = Math.min(params.max ? params.int('max') : 10, 100) 
    def ls = Book.executeQuery("from Book a",[max: params.max, offset: params.offset]) 
    def totalCount = Book.executeQuery("from Book a").size() 
    [bookInstanceList: ls, bookInstanceTotal: totalCount] 
} 
+0

Alidadありがとう、あなたは私を救った。それは絶対に正しく機能しました。 – vivek

+0

アリダムは、params.maxを設定した方法を教えてください。params.offsetのデフォルト値を設定するにはどうすればいいですか? – vivek

+1

ページ区切りタグを使用してデフォルトのオフセットを渡すことができます。 このオフセットを設定した場合は、最初にページが読み込まれたときにそのオフセットから開始するように指示する必要があります。このようなものdef ls = Book.executeQuery( "Book a"から、[max:params.max、offset:params.offset?:20]) – Alidad

0

正しく覚えていれば、ビューに渡すモデルにmaxプロパティとoffsetプロパティを追加すると、自動的に改ページされます。その時点で、ページセットタグを使用して結果セットを反復処理できるはずです。ここではドキュメントを参照してください。

http://grails.org/doc/latest/ref/Tags/paginate.html

+0

私は、使用最大持た:25しかし、これは、レコードにページあたり25に制限されますが、それはdoesnの残りのレコードを表示します。 – vivek

0

Grailsの基準クエリとページネーションのparams

params.max = params?.max as Integer ?: 10 
params.offset = params?.offset as Integer ?: 0 
params.sort = params?.sort ?: "email" 
params.order = params?.order ?: "asc" 
params.filter = params?.filter ?: "" 
params.packet = params?.packet ?: "" 

def members = Member.createCriteria().list(params) 
    { 
    or 
    { 
     if(params.filter != ""){ 
     ilike("firstName", "%" + params.filter + "%") 
     ilike("lastName", "%" + params.filter + "%") 
     ilike("email", "%" + params.filter + "%") 
     try { 
      params.filter as Long 
      eq("citizenId" , params.filter.toLong()) 
     }catch (e) { 

     } 
     ilike("mobile", "%" + params.filter + "%") 
     } 
    } 
    } 

def dataMembers = [:] 
dataMembers.data = members 
dataMembers.totalRecord = members.totalCount 
render dataMembers as JSON 

出力

{ 
"data": [ 
    { 
     "id":1, 
     "firstName":name 
    }, 
    { 
     "id":2, 
     "firstName":name 
    } 
    ], 
"totalRecord":5 
} 
関連する問題