Граальс Джсон Маршаллинг - PullRequest
1 голос
/ 25 мая 2011

У меня есть объект домена, который имеет отношение 1 - M с другим объектом домена, например,

Персона 1 -> M Langauges

Я зарегистрировал маршаллер объекта JSON, чтобы маршалировать объект 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, где я передаю поисковый термин в конструкторе, регистрирую маршаллер объекта для оболочки и фильтрую в оболочке.

Это кажется мне довольно расточительным, поскольку мне нужно перебирать результаты моего домена и создавать оболочку для каждого экземпляра.

Будем благодарны за любые предложения.

Ответы [ 3 ]

1 голос
/ 30 мая 2011

может быть, вы ищете что-то подобное:

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 голосов
/ 31 марта 2014

Вы можете отфильтровать ваш запрос и подготовить его к визуализации:

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 и установить alias для каждого property. Таким образом, вы можете создавать собственные рендеры для определенных ситуаций.

Примечание: этот код не тестировался, это просто грубая идея.

0 голосов
/ 25 мая 2011

звучит очень сложно для такого общего случая использования.Вы можете осуществлять поиск среди своих людей и соответствующих языков, используя критерии, а затем конвертировать результат в соответствующий формат 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...