2011-05-25 49 views
1

我有一個域對象與另一個域對象有1 - M的關係,例如grails json marshalling

人1 - > MS漢語語言

我已經註冊JSON對象編組編組Person對象。我正在處理的用例是以默認顯示主語言的表格格式顯示Person。

我遇到的問題是,當用戶生成語言搜索,並且我想爲人顯示匹配語言而不是主要語言。

我遇到的問題是我不知道如何訪問在對象編組器中搜索的語言,因此我無法確定在表格格式的JSON中呈現的匹配語言。

這裏的示例代碼我對人:

JSON.registerObjectMarshaller(Person) { 

def returnArray = [:] 
    returnArray['id'] = it.id 
    returnArray['name'] = it.displayName?:"" 
    //I would like to be able to get the language matching a search param here 
    //when a search has been carried out 
    returnArray['language'] = it.primaryLanguage?:"" 

    } 

目前,解決辦法我已經是有一個PersonWrapper,我通過搜索詞在構造函數中,註冊了一個對象編組包裝和過濾器在包裝。

這對我來說似乎很浪費,因爲我需要迭代我的域結果併爲每個實例創建一個包裝。

任何建議將不勝感激。

回答

0

對於這樣一個常見的用例聽起來很複雜。您可以使用條件搜索您的人員和相應的語言,並將結果轉換爲適當的json格式。例如

def result = Person.createCriteria().list { 
    language { 
     eq("lang", "de") // could be your search term 
    } 
} // you can also use hql to achieve our requirement 

def json = [] 

result.each { 
    json << [id: result.id, name: result.name, ...] 
} 

render json as JSON 
+1

thx。我有這種形式的查詢,問題是,當我從休眠中得到所有的語言加載後,因爲我真的只想過濾匹配的語言呈現給最終用戶。 – 2011-05-27 22:14:19

1

也許你正在尋找類似的東西:

def filterLang = Language.findByCode("de") 

// search for persons having the filter language assigned 
def foundPersons = Persong.executeQuery("select p from Person as p inner join p.languages as lang where lang = :filterLang",[filterLang : filterLang]) 

def json = [] 

foundPersons .each { 
    json << [id: it.id, name: it.name, language: filterLang] 
} 

render json as JSON 
0

您可以過濾查詢並準備渲染:

import org.hibernate.criterion.CriteriaSpecification 

List list = Person.withCriteria { 
    maxResults 5 
    resultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP) 
    alias 'languages', 'lan' 
    projections { 
    property 'id', 'id' 
    property 'displayName', 'name' 
    property 'lan.language', 'language' 
    } 
    eq 'lan.language', 'FR'  
} 

那麼你可以使用結果

render list as JSON 

您必須使用resultTransformer,並且爲每個property設置alias。因此,您可以爲特定情況創建自定義渲染。

注意:該代碼尚未經過測試,只是一個粗略的想法。