Grails 获取子域对象 [英] Grails get child domain objects

查看:16
本文介绍了Grails 获取子域对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个域类,一个是父类,另一个是子类,它们之间有 hasMany 关系.父类有很多孩子,子类属于父类.这是编码示例.

I have two domain classes one is parent and other one is child and i have a hasMany relationship between them. Parent class has many childs and child class belongs to parent class. And here is coding example.

class Parent{
   String name
    static hasMany = [childs:Child] 
    static constraints = {
   }
}


class Child{
   String name
   static belongsTo = [parent:Parent]
   static constraints={}
}

问题是一旦我得到父对象,与父类关联的子对象也被获取.但是当我将对象转换为 JSON 时,我没有完全看到子对象,我只能看到子对象的 ID.我想查看子对象的所有列,而不仅仅是 Id.

Problem is as soon as I get the parent object the child objects associated with parent class were also fetched. But when I convert the object to JSON I don't see the child object completely I can only able to see the ID's of child objects. I want to see all columns of child object instead of only Id.

转换后的 JSON 响应:

Converted JSON response:

[{"class":"project.Parent","id":1,
  "name":"name1","childs":[{"class":"Child","id":1},{"class":"Review","id":2}]}]

但我也想要包含子对象名称的响应,如下

But I want the response which contains name of child object too, as follows

[{"class":"project.Parent","id":1,"name":"name1",
  "childs":[{"class":"Child","id":1,"name":"childname1"},
            {"class":"Review","id":2,"name":"childname2"}
           ]
}]

非常感谢任何帮助.提前致谢.

Any help greatly appreciated. Thanks in advance.

推荐答案

问题在于使用默认的 JSON 转换器.以下是您的选择:

The issue is with the use of default JSON converter. Here are your options:

 1. Default  -  all fields, shallow associations
    a. render blah as JSON

 2. Global deep converter - change all JSON converters to use deep association traversal
    a. grails.converters.json.default.deep = true

 3. Named config marshaller using provided or custom converters
    a. JSON.createNamedConfig('deep'){
        it.registerObjectMarshaller( new DeepDomainClassMarshaller(...) )
    }
    b. JSON.use('deep'){
        render blah as JSON
    }

 4. Custom Class specific closure marshaller 
    a. JSON.registerObjectMarshaller(MyClass){ return map of properties}
    b. render myClassInstance as JSON

 5. Custom controller based closure to generate a map of properties
    a. convert(object){
        return map of properties
    }
    b. render convert(blah) as JSON

您当前使用的是默认选项 1.

You are currently using Option 1, which is default.

您可以做的最简单的事情是使用选项 2 设置全局深度转换器,但请注意这会影响您应用中的所有域类.这意味着,如果您有一个以顶级对象为顶点的大型关联树,并且您尝试转换这些顶级对象的列表,则深度转换器将执行所有查询以获取所有关联对象及其关联对象转动.- 您可以一次性加载整个数据库 :) 小心.

The simplest you can do is use Option 2 to set global deep converter, but be aware this effects ALL domain classes in your app. Which means that if you have a large tree of associations culminating in a top level object and you try to convert a list of those top level objects the deep converter will execute all of the queries to fetch all of the associated objects and their associated objects in turn. - You could load an entire database in one shot :) Be careful.

这篇关于Grails 获取子域对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆