`

神奇的Grails:自关联的树状Domain一行代码获取所有子节点

阅读更多

      见证Groovy/Grails的神奇时刻到了,你相信吗?用一行代码就可以获取树状结构中某节点下的所有全部子节点!注意:这个树是无深度限制的。无深度限制这点很重要,如果有限深度的树,那我们也很容易通过层级编码用“Like 001%”方式实现(维护编码也是一个有挑战性活)。我们以一个非常常见的“类别”Domain为例,大类分小类,小类再细分,典型的树形结构,看看Grails是如何以简洁的语法表达的,体验Groovy语法的神奇!

 

 

class Group{
    String name

    static hasMany = [children:Group]
    static belongsTo = [parent: Group]

    static transients = ['allChildren']

    def getAllChildren(){
        children ? children + children*.allChildren.flatten() : []
    }
}

 

1.两行代码表述一个树状结构,同时Grails自动为你生成数据库表

 

static hasMany = [children:Group]
static belongsTo = [parent: Group]

 

2.一行代码获取任意深度的全部子节点:

 

children ? children + children*.allChildren.flatten() : []

   递归调用这个是必须的*.allChildren.flatten()。

   短短一行代码,展现了五个Grovvy的知识点:

   (1)可以省略 return 。这对不愿多打一个字母的懒人来说也是不小的福利;

   (2)[]。这可不是数组,在Groovy中最常见的列表List;

   (3)操作符重载:List 的 “ + ” 运算符。assert [1,2,3,4] == [1,2] + [3,4];

   (4)*展开元素操作符。自动对List中的每个元素进行枚举操作,不用为此写一个for循环了;

   (5)flatten() 。这是实现此算法的关键,它将所有递归得到的嵌套子节点List使用flatten操作,

得到一个一维的Group列表。List的这个flatten()方法能作到:

       assert [1,2,3,4,5] == [1,[2,3],[[4]],[],5].flatten()

 

至此,一个完全可用的树状结构领域模型完成了,你可以调用Grails的GORM语法糖addToChildren,removeFromChildren 任意的添加/删除子节点,save,delete这些神奇的GORM方法自不用说,更不用写Hibernate的XML。

0
2
分享到:
评论
6 楼 java-007 2014-05-04  
alanland 写道
一楼还有个眉头没脑的提问

你的理解能力真TM差,傻逼。
5 楼 xpjava 2014-05-02  
请问大侠,如何显示?这个树形结构?
4 楼 alanland 2013-12-25  
一楼还有个眉头没脑的提问
3 楼 alanland 2013-12-25  
涨知识了,还学到一个 flatten
2 楼 flashcloud 2011-09-08  
没太明白你说的,生成的脚手架直接中文?我没清楚你说的需求点在哪
1 楼 java-007 2011-09-07  
赞。哥们改过grails的源码吗?
有没有想过直接定义一下属性,让他生成的代码直接都是中文的。

相关推荐

    根据父节点找所有子节点数据.zip

    在这个场景中,我们从给定的父节点出发,每次递归调用都会检查当前节点的每一个子节点,并将子节点添加到结果集中,如果子节点还有自己的子节点,就继续递归下去,直到遍历完所有子节点。 这个工具类可能包含以下几...

    树父节点递归获取树子节点

    在Java中,通过递归方法我们可以轻松地实现从父节点获取所有子节点的功能,这对于构建树形结构的应用程序(如文件系统、组织结构或菜单系统)非常有用。理解并掌握递归是每个程序员必备的技能之一。

    javascript获取指定节点父节点、子节点的方法

    通过子节点获取 1. childNode.parentNode:获取已知节点的父节点。 这些方法只是基本的方法,如果使用了 Prototype 等 JavaScript 库,可能还获得其他不同的方法,例如通过节点的 class 获取等等。不过,如果能够...

    c# treeview 获取子节点

    例如,获取特定父节点下的所有子节点: ```csharp List<TreeNode> GetChildNodesByParent(string parentText) { List<TreeNode> children = new List(); foreach (TreeNode node in treeView1.Nodes) { if ...

    SQL 查询树形子节点.

    sql 查询 所有子节点 方法已经调试通过(sql-server 2005)

    根据当前节点获取所有父节点信息

    根据当前节点获取所有父节点信息(18代)SQL根据当前节点递归遍历获取所有父节点信息,短短的SQL可以解决复杂的问题

    根据子节点的金额向上汇总所有父节点的金额

    标题中的“根据子节点的金额向上汇总所有父节点的金额”是一个典型的树形结构数据处理问题,常见于组织架构、账目统计或者数据库层次结构的数据分析。这个问题涉及到的知识点包括但不限于: 1. **树形结构**:在...

    js树插件zTree获取所有选中节点数据的方法

    本文实例讲述了js树插件zTree获取所有选中节点数据的方法。分享给大家供大家参考。具体分析如下: 由于刚接触Tree方面的东西。在网上看到了zTree,是中国人写的。所以API肯定是中文的。而且评论也很好。所以尝试用...

    MySQL实现树状所有子节点查询的方法

    在MySQL中,实现树状所有子节点的查询并非像Oracle那样可以直接使用Hierarchical Queries和`CONNECT BY`语句。然而,尽管MySQL不直接支持这样的功能,我们仍然可以通过其他方法来达到相同的效果。以下将详细介绍几种...

    删除TreeView节点以及其子节点

    在Delphi编程环境中,删除`TreeView`控件中的节点及其子节点是一项常见的...通过理解和应用上述知识点,你可以掌握在Delphi中删除`TreeView`节点及其子节点的方法,这对于开发涉及树形结构数据管理的应用程序非常重要。

    带复选框的多级目录树,复选框的选择控制子节点父节点 全选和反选

    在前端实现中,通常使用JSON对象来存储树形数据,每个节点包含一个标识符(ID)、名称、以及指向子节点的引用。展示时,可以通过递归函数将这些数据转化为可交互的HTML元素。 3. **全选和反选(Select All and ...

    根据子节点查找所有父节点

    总的来说,根据子节点查找所有父节点的问题涉及到对树形结构的理解和遍历。通过使用合适的搜索算法,我们可以有效地从树的任意子节点追踪到根节点,获取所有中间的父节点。在实际开发中,这样的操作对于理解和操作...

    TreeControl复选框:选中某个节点的复选框后,自动选中子节点的复选框

    在Windows编程中,如MFC(Microsoft Foundation Classes)或WPF(Windows Presentation Foundation)中,TreeControl是用户界面的重要组成部分,它以树状结构显示数据,每个节点可以有子节点,形成一个可展开和折叠...

    使用递归删除树形结构的所有子节点(java和mysql实现)

    使用递归删除树形结构的所有子节点(java和mysql实现) 在树形结构中删除某个父节点时,需要递归删除其所有子节点,以避免遗留冗余数据。下面将为大家介绍使用 Java 和 MySQL 实现递归删除树形结构的所有子节点的...

    【JavaScript源代码】element的el-tree多选树(复选框)父子节点关联不关联.docx

    在JavaScript的前端开发中,Element UI 是一个常用的UI库,提供了丰富的组件,其中包括el-tree,一个用于构建树形结构的组件。在el-tree中,如果需要实现多选(复选框)功能,我们可以利用`show-checkbox`属性来开启...

    AjaxTree源码,AJAX动态获取节点的子节点

    AjaxTree是一款基于AJAX技术实现的树形视图控件,其核心特性在于能够动态地通过服务器请求获取节点的子节点数据,从而避免一次性加载大量数据导致页面性能下降的问题。这一设计模式在网页应用中非常常见,尤其是在...

    安卓树形控件相关-android实现简单的多选结构树勾选父节点全选子节点等功能可以根据自己需要修改.rar

    在这个“安卓树形控件相关-android实现简单的多选结构树勾选父节点全选子节点等功能可以根据自己需要修改”的项目中,开发者提供了一个实现多选功能的树形控件,支持勾选父节点时全选子节点的功能,方便用户快速操作...

    echarts tree 点击节点收缩(关闭子节点)功能实现

    在本文中,我们将深入探讨如何在ECharts库中实现一个具有点击节点收缩(关闭子节点)功能的树形图表(Tree)。ECharts是一款基于JavaScript的数据可视化库,它提供了丰富的图表类型,包括柱状图、折线图、饼图以及...

    获取树的下级所有和上级所有

    这个标签表明重点在于获取树形结构中某节点的所有子节点。在实际应用中,这可能包括多级下级,不只是一级。通过调整上述的递归查询,可以获取任意深度的子节点。 **文件名称列表:获取树的下级所有和上级所有.txt**...

    父节点选中自动选中其相应的子节点(转别人的)

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是如何在树形结构(Tree)控件中实现“父节点选中时自动选中其所有子节点”的功能,并且遇到了`node.attributes is undefined`的问题。...

Global site tag (gtag.js) - Google Analytics