论坛首页 入门技术论坛

Hibernate中如何通过父节点查询所有子节点?

浏览 10818 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-05-14  
假如数据表结构如下:
id    parent_id
001   null
002   001
003   001
004   003
005   003

那么要查询001的所有子节点应该为002,003,004,005
查询003的所有子节点则为004,005。

hibernate中用native sql查询方式可以用oracle的connect by的途径实现,
但是这个只能适用于oracle db,sql server则不行了,
那么除了用递归还有没有其他更好的办法?
   发表时间:2007-05-14  
循环sql句。。。性能不是很差必竟都是有索引的。。
0 请登录后投票
   发表时间:2007-05-15  
不少人投为新手贴,有点困惑,是更好的方案都处都有,还是。。。。?
老手们是不屑一谈,还是根本就不知道有其他办法?

其实这个问题很多人都存在,不过我从没在一个地方看到有其他解决方案,
真的就没有更好的办法了?我不信,毕竟既要跨数据库又想提高性能
的开发人员还是存在,递归这样的办法只是没办法的办法,一个公司组织结构
存在五六层,几百个部门,甚至更多,如果递归的话性能只能说很一般。

PS:
新手贴还是老手贴,这种东西的评价放在论坛中不见的是有意思的事。
真要想管理好帖子内容,不如就做一些智能点东西,
比如根据一些规则,自动把对应文章转移到对应的位置。
同时还可以通知用户转移的位置/原因。

如果一个论坛不能成为一个平台,而只是成为少数人的交流地,那么这个论坛要发展我想很难,
除非论坛定为就是这样,那算我白说.




0 请登录后投票
   发表时间:2007-05-15  
我觉得树形结构,用一个treeid比较好,比如你举的例子:
id parent_id treeid
001 0 0
002 001 001002
003 001 001003
004 003 001003004
005 003 001003005

在这样的情况下,如果要查出所有子节点,则treeid like 001%就可以,或是用substr(treeid,'001')这样的查询。
0 请登录后投票
   发表时间:2007-05-15  
财务系统的科目结构就是一个比较典型的例子。
0 请登录后投票
   发表时间:2007-05-15  
循环不爽的话,可以用这种方式
(建一视图。。。)视图比表多一个字段。这个字段是递归方式生成父ID的集合用逗号分开。。。。。
laoer 写道
我觉得树形结构,用一个treeid比较好,比如你举的例子:
id parent_id treeid
001 0 0
002 001 001002
003 001 001003
004 003 001003004
005 003 001003005

在这样的情况下,如果要查出所有子节点,则treeid like 001%就可以,或是用substr(treeid,'001')这样的查询。


刚刚发现有人说过了。。。

PS:才6票怕什么,民主就是这样的。。。到了25也可以申诉么。。。
0 请登录后投票
   发表时间:2007-05-19  
laoer 写道
我觉得树形结构,用一个treeid比较好,比如你举的例子:
id parent_id treeid
001 0 0
002 001 001002
003 001 001003
004 003 001003004
005 003 001003005

在这样的情况下,如果要查出所有子节点,则treeid like 001%就可以,或是用substr(treeid,'001')这样的查询。



旧版本系统我是这样做的,但是后果有点严重,
比如公司部门结构改动,002变成003下面的一个部门,那么这个之后的所有部门
都必须要重新更新treeid,这个变动的部门排在越前面影响越大。
小公司还好,但是我们公司上千个部门,改动就影响比较大了。

所以结构我觉得还是下面三个组合在一起比较好:
id  parent_id  index
有上面三个数据就可以很好的建立树的结构,而且相互之间影响最小。
0 请登录后投票
   发表时间:2007-05-19  
抛出异常的爱 写道
循环不爽的话,可以用这种方式
(建一视图。。。)视图比表多一个字段。这个字段是递归方式生成父ID的集合用逗号分开。。。。。
laoer 写道
我觉得树形结构,用一个treeid比较好,比如你举的例子:
id parent_id treeid
001 0 0
002 001 001002
003 001 001003
004 003 001003004
005 003 001003005

在这样的情况下,如果要查出所有子节点,则treeid like 001%就可以,或是用substr(treeid,'001')这样的查询。


刚刚发现有人说过了。。。

PS:才6票怕什么,民主就是这样的。。。到了25也可以申诉么。。。


民主是好事,不过就怕挂着民主的口号把一些可以讨论的问题埋藏了。

建个view来处理这个treeid,倒是可以解决更新的问题,看看有没有办法处理这个view
0 请登录后投票
   发表时间:2007-05-19  
支持treeid的做法
0 请登录后投票
   发表时间:2007-05-20  
04年作过这样的设计,
oracle有SQL支持,
db2有SQL支持,
postgresql没支持,自己写几个存储过程在sql里面当作函数调用,同样可以。

sql server也可以这样搞吧。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics