使用HQL进行递归查询

时间:2009-08-02 09:28:10

标签: recursion hql recursive-query

我有这张表

CREATE TABLE IF NOT EXISTS `branch` (
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `studcount` int(11) DEFAULT NULL,
  `username` varchar(64) NOT NULL,
  `branch_fk` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKADAF25A2A445F1AF` (`branch_fk`),
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;
ALTER TABLE `branch`
  ADD CONSTRAINT `FKADAF25A24CEE7BFF` FOREIGN KEY (`login_fk`) REFERENCES `login` (`id`);

你可以看到每个表都有一个指向其他分支行的外键(自我关系) 我想要一个使用HQL(更喜欢HQL)的查询来获取我的用户名(或id)并返回List<String>(用于用户名)或List<Integer>(用于id),这是我的所有列表支行;

让我在Example

中显示
id         studentcount            username            branch_fk
1          312                     user01                NULL
2          111                     user02                1
3          432                     user03                1
4          543                     user04                2
5          433                     user05                3
6          312                     user06                5
7          312                     user06                2
8          312                     user06                7

当我调用GetSubBranch(3)时我想要返回:

5, 6

当调用GetSubBranch(2)我想要返回时:

4, 7, 8

2 个答案:

答案 0 :(得分:1)

我相信没有可移植的SQL来做到这一点。 更重要的是,我认为几个主要数据库的SQL无法表达这一点。

因此,此功能不是您在HQL中可以执行的操作的一部分。对不起: - (

我读了几个方法。其中大多数涉及权衡取决于级别的数量(提前确定?多少?),记录数量(数百万?)等:

  1. 自己进行递归查询,每次调整(使用in(ids)),直到某个级别为空。
  2. 使用固定数量的左连接执行查询(您的深度需要提前知道;或者如果需要,您可能需要重复查询以查找其余记录,请参阅第1点)。
  3. 在某处可以获得非规范化信息:它可以是索引的非规范化表复制。但我更喜欢缓存的内存中副本,它可以只在一个请求中完全填充,并且可以更新或无效......取决于您的其他必要条件,如表大小,最大深度,写频率等。 / LI>

答案 1 :(得分:1)

有人可能会看看'嵌套集'。查询成为'之间:L和:R'的问题。但拓扑/分层排序丢失(与递归/分层查询相比)。然后插入新项目非常昂贵,因为它需要更新几个(如果不是所有)行...