2013-09-29 2 views
1

я в настоящее время имеют следующие 3 класса домена:ограничивают объем данных при использовании withCriteria

User.groovy

class User { 
    ... 

    static hasMany = [ 
     ... 
     ] 

    static belongsTo = [   
     course : Course, 
     university : University  
     ] 

} 

Course.groovy

class Course { 

    String title 

    static hasMany = [ 
     universities : University, 
     users : User 
     ] 

    static belongsTo = University  

} 

University.groovy

class University { 

    String name 

    static hasMany = [ 
     courses : Course, 
     users : User 
     ]   
} 

Я собираю все курсы для университета со следующим кодом:

def courses = Course.withCriteria {  
      universities { 
      eq('id', Long.parseLong(params.universityId)) 
      } 
     } 
     render courses as JSON 

с примером ответа, как так:

[{ 
      "class":"classifieds.Course", 
      "id":1, 
      "title":"Computer Science", 
      "universities": 
       [{"class":"University", 
        "id":1}], 
      "users": 
       [{"class":"User" 
        ,"id":1}] 
     }] 

Моя проблема заключается в том, что я хочу, чтобы ограничить объем ответа на не включают users или universities, которые в настоящее время возвращаются, я только то, что список courses будет возвращен в JSON. Как это ограничить?

+1

'University.get (params.long ('universityId')) .courses.title как JSON'? –

+0

спасибо за это - близко .. Возможно ли вернуть «курс» с «id», так что ответом будет сборник «{« id »: 1,« title »:« Computer Science »}' и т.д? –

+2

'University.get (params.long ('universityId')) .courses.collect {[id: it.id, title: it.title]} как JSON'? ;-) –

ответ

2

Регистрация нужного JSON маршаллера объектов для Course в начальной загрузке, как показано ниже:

//Bootstrap 
def init = { servletContext -> 
    JSON.registerObjectMarshaller(Course){ 
     def returnObj = [:] 
     returnObj.id = it.id 
     returnObj.title = it.title 

     returnObj 
    } 
} 

Вышеуказанные регистры возвращают только поля Course при преобразовании и оказываемые JSON. Обратите внимание, что это будет постоянно маршалировать курс только для возвращения его полей, а не его ассоциаций. При необходимости временно, вы можете очень хорошо следовать подходу Тима.

В случае, если вы хотите сделать его общим для всех полей, а затем:

JSON.registerObjectMarshaller(Course){course -> 
    def fields = grailsApplication.domainClasses 
            .find{it.name == 'Course'} 
            .properties 
            .findAll{!it.association} 
            .name - 'version' //Remove version if req. 

    return fields.collectEntries{[it, course."$it"]} 
} 

при условии grailsApplication впрыскивается Bootstrap.groovy

Чтобы добавить, если намерение не изменить способ JSON построен, но согласовать критерии на результат, то используйте projections, чтобы получить необходимую property:

def courses = Course.withCriteria {  
    universities { 
    eq('id', Long.parseLong(params.universityId)) 
    } 
    projections{ 
     property('id') 
     property('title') 
    } 
} 

UPDATE:
Для того, чтобы получить результаты, как отображенных лиц, то я бы следовать HQL, как shown here или использовать createCriteria и трансформируют результат на карту, как показано ниже (непроверенные):

import org.hibernate.transform.Transformers 

def criteria = Course.createCriteria() 
criteria.resultTransformer(Transformers.ALIAS_TO_ENTITY_MAP) 
def courses = criteria.list {  
    universities { 
    eq('id', Long.parseLong(params.universityId)) 
    } 
    projections{ 
     property('id') 
     property('title') 
    } 
} 

Я не уверен, что псевдонимы создаются именами свойств. Я сталкиваюсь с любой проблемой, вы можете быстро отбросить запрос HQL.

+0

Мне нравится идея использования 'прогнозов', когда я пробовал ее, но с тем, что у вас выше, формат ответа, похоже, отличается от обычного ответа JSON. Это в строках '([1: Computer Science], [2: Physics]), а не' {{id:: 1, «title»: «Computer Science»}, {«id»: 2, «title»: «Physics»}} ' –

+1

Попробуйте использовать HQL или' createCriteria'. См. Мое обновление. @andymccullough – dmahapatro

+0

выглядит хорошо, я дам ему попробовать - спасибо! –

Смежные вопросы