2012-03-12 16 views
2

型號:Grails的,禁用預先抓取時呈現域列表作爲JSON

class Author{ 
    String name 
    static hasMany = [books: Book]  
} 

class Book{ 
    String name 
    Author author 

    static belongsTo = Author 
} 

然後,我有一個控制器

class MyController{ 
    def authors{ 
    def authors = Author.getAll() 
    render authors as JSON 
    } 

的問題是,即使關聯作者書籍很懶,執行N + 1個查詢以獲取每個作者的書籍。這是怎麼回事,我該如何禁用它

+0

什麼是JSON的全類路徑轉換的您正在使用? – 2012-03-12 15:20:02

+0

即時通訊使用默認的JSON實現:grails.converters.JSON – geo 2012-03-12 15:45:34

回答

5

您正在使用默認的JSON轉換器,它試圖轉換您的模型的所有領域。這就是爲什麼它正在做所有這些選擇。

你應該爲你的模型實現你自己的JSON轉換器,它不會向DB請求書籍。你可以做到這一點自舉這樣的:

import grails.converters.JSON 
class BootStrap { 
    def init = {servletContext -> 
     JSON.registerObjectMarshaller(Author) { 
      def returnArray = [:] 
      returnArray['name'] = it.name 
      return returnArray 
    } 

}