2010-10-26 36 views
0

在以下情況下,作者對象具有「書籍」的現有列表。 如果控制器已經有一個「作者」對象,並且你不想回到數據庫,請用 Book.findAll(「from Book as b where b.author = :作者」 [作者:作者簡介],[最大:10,偏移量:5])grails分頁與1:m關係的列表

class Author { 
    String name 
    static hasMany = [ books:book] 
} 
class Book { 
    String title 
    static belongsTo = [ author:Author ] 
} 
+0

只是好奇,有什麼問題,使數據庫查詢?分頁的目的之一是*鼓勵*額外的數據庫查詢,以避免在內存中存儲大量數據。 – 2010-10-26 11:34:15

+0

@Rob,@Aaron,出於兩個原因:'1'圖書清單已經存在,爲什麼我必須重新開始,'2'我會有兩種不同的方法來獲取相同的數據,然後都需要單獨測試和維護。 – 2010-10-28 07:42:43

回答

2

好久不見!

我當然會同意Rob在這裏。

您將在sql日誌中看到的是在這兩種情況下針對作者和書籍所做的多個查詢。 Grails默認爲延遲加載集合,因此在聲明

def author= Author.findByName(params.id) 

您只加載作者,而不是書籍。

添加額外語句以正常分頁方式加載書籍會更有效率,並且更易於維護,因爲它更乾淨,更明顯。

這是我通常用來獲取這種數據的風格。

def timeline = { 
    println "timeline[" + params+ "]" 
    if (params.id) { 
    def author= Author.findByName(params.id) 
    def books = Book.withCriteria { 
     eq('author', author) 
     firstResult(5) 
     maxResults(10) 
    } 
    def totalBooks = Book.createCriteria().count { 
     eq(author, author) 
    } 

    ... 
} 

此外,(不知道這個),但對藏書的大小()語句將觸發計數查詢,但也可能引發其它查詢過,所以當你有這麼大的數據是值得設置爲具體在你得到GORM做什麼。

(根據條例草案註釋更新如下)

+0

歡呼聲大衛。我確實需要行eq('author',author)上的引號。這當然看起來比我的解決方案好。儘管我不能直接使用author.books,但它仍然令人不安 – 2010-10-28 14:45:40

0

我承認我是一個Grails的新手 - 我想我必須失去了一些東西。

所以之後很多搞亂這裏是我很醜陋的解決方案:

def timeline = { 
println "timeline[" + params+ "]" 
if (params.id) { 
    def author= Author.findByName(params.id) 

    def allbooks = author?.books as List 

    def max=params.max?:(allbooks.size()>2 ? 2: allbooks.size()) 
    def offset=params.offset?:(0) 

    offset = offset as int 
    max = max as int 

    def start = offset*max > allbooks.size()-1 ? allbooks.size()-1 : offset*max 
    def end = ((offset*max)+max-1) > allbooks.size()-1 ? allbooks.size() -1 : ((offset*max)+max-1) 

    def books= allbooks.size() > 0?allbooks[(start)..(end)]:allbooks 

    def bookCount = allbooks.size() 

    println "max:" + params.max + "" 
    println "books.size:" + books.size() + ", bookCount:" + bookCount 

    [author, bookCount, books] 
    } 
+0

不是一個好主意,就像Rob說額外的查詢沒有問題,讓GORM處理緩存並處理你的數據庫問題,那就是 – 2010-10-26 23:02:11