2012-03-01 71 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

谢谢阿里,你救了我。它的工作绝对正确。 – vivek 2012-03-02 09:45:49

+0

Alidad可以请你告诉我,我们已经建立了params.max的方式,我们怎么能设置params.offset的默认值。 – vivek 2012-03-02 10:38:57

+1

您可以通过分页标签通过偏移默认。 但是如果你设置了这个偏移量,你需要告诉你的动作在第一次加载页面时从该偏移量开始。像这样def ls = Book.executeQuery(“from Book a”,[max:params.max,offset:params.offset?:20]) – Alidad 2012-03-02 16:07:31

0

如果我没有记错,您可以添加max和抵消你传递到您的视图属性模型,它应该在分页自动线。在这一点上,你应该能够使用paginate标签遍历你的结果集。请参阅该文档在这里:

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

+0

我使用最多:25但这会限制记录25页,但它不” t显示其余的记录。 – vivek 2012-03-01 15:17:39

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 
}