当前位置: 首页 > 面试题库 >

Grails获取子域对象

巫马玉堂
2023-03-14
问题内容

我有两个域类,一个是父级,另一个是子级,并且它们之间具有hasMany关系。家长班有很多孩子,孩子班属于家长班。这是编码示例。

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


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

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

转换后的JSON响应:

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

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

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

任何帮助,不胜感激。提前致谢。


问题答案:

问题在于使用默认的JSON转换器。这是您的选择:

 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,这是默认选项。

您可以html" target="_blank">执行的最简单的操作是使用选项2设置全局深度转换器,但是请注意,这会影响应用程序中的所有域类。这意味着,如果您有一个大型关联树结结为一个顶级对象,并且尝试转换这些顶级对象的列表,则深层转换器将执行所有查询以获取所有关联对象及其关联对象。转。-
您可以一次加载整个数据库 :)注意。



 类似资料:
  • 问题内容: 我需要编写一个函数来解析包含域名的变量。最好用一个示例来说明,变量可以包含以下任何内容: 但是当通过我的函数传递时,所有这些都必须返回example.com或example.co.uk,基本上是根域名。我敢肯定我之前已经做过,但是我已经搜索Google约20分钟了,找不到任何东西。任何帮助,将不胜感激。 编辑:忽略.co.uk,假定通过此功能的所有域都具有3个字母的TLD。 问题答案:

  • 问题内容: 我的网址可以是以下任何一种格式: 本质上,我需要能够匹配任何常规URL。我如何 通过一个正则表达式从所有这些文件中提取(或.net,无论tld刚好是什么。我需要它与任何TLD一起使用)? 问题答案: 好了,您可以用来获取主机: 然后,您可以做一些有趣的事情,仅获取TLD和主机 不是很优雅,但应该可以。 如果您想要一个解释,请按照以下步骤进行: 首先,我们使用的功能来抓取方案之间的所有内

  • 问题内容: 例如,地址为: 我想将子域保存到变量中,这样我就可以这样做; 问题答案: 会将URL拆分为协议,位置,端口等。然后,您可以通过拆分位置来获得子域。

  • 问题内容: 我正在用我的域对象映射一堆旧表。有没有办法在Domain类中查找属性的数据库列名(反之亦然)?例如: 有没有一种方法可以使用firstName取回字符串“ FIRST_NAME”或“ first_name”?我尝试使用 但这仅出于某种原因为我提供了id列。谢谢! 问题答案: 好的,我认为这就是您要寻找的。给定以下域 您可以使用以下命令检索域数据: 您还可以使用以下闭合符打印出所有列名称

  • 这是我第一次使用Grails,我定义了以下域类 但当我尝试运行应用程序或为这些域生成任何控制器时,它显示了这个错误 我找不到问题,在此之前,控制台向我展示了这样的东西,它无法创建表“产品”和“类别” 编辑 我只是简单地解决了将“HasMany”改为“HasMany”的问题。但现在我不知道为什么控制台会显示这个

  • 我的理解是,默认情况下,Hibernate将所有关系类型的FetchType设置为lazy。 在我的例子中,我有一个双向的OneToMany-ManyToOne关系,如下所示: 另一个问题是我如何得到一个有特定名字的孩子?是否可以通过存储库进行操作?还是需要getChildren(parentId)并迭代直到找到以特定方式命名的那个? 编辑:在一些建议之后,我继续这样实现了我的ChildRepos