2012-03-01 74 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 
}