代码之家  ›  专栏  ›  技术社区  ›  Am1rr3zA

使用HQL的递归查询

  •  1
  • Am1rr3zA  · 技术社区  · 15 年前

    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         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 回复  |  直到 15 年前
        1
  •  1
  •   KLE rslite    15 年前

    更重要的是,我认为几个主要数据库的SQL不能表达这一点。

    因此,这个功能不是您在HQL中可以做的部分。对不起:-(

    1. 你自己进行递归查询,每次都进行平级(使用 in(ids)
    2. 使非规范化信息在某处可用:它可以是索引的非规范化表复制。但我更喜欢一个缓存在内存中的副本,它可能只在一个请求中被完全填充,并且被更新或失效。。。取决于您的其他必要条件,如表大小、最大深度、写入频率等)。
        2
  •  1
  •   Chadwick    13 年前