2009-08-02 5 views
1

У меня есть эта таблицаРекурсивный запрос с использованием HQL

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), который был списком всех моих субботов;

позвольте мне показать в примере

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 

ответ

1

Я считаю, что для этого нет портативного SQL. Более того, я думаю, что SQL SQL не может это выразить.

Следовательно, эта возможность не является частью того, что вы можете сделать в HQL. Извините :-(

Я прочитал несколько способов пойти. Большинство из них связано с компромиссами в зависимости от количества уровней (заранее установленных? Сколько?), Количества записей (сотни? Миллионов?) И т. Д .:

.
  1. Продлайт рекурсивные запросы самостоятельно, выравнивая вниз каждый раз (с in(ids)), пока некоторый уровень пуст
  2. ли запрос с фиксированным числом слева присоединяется (ваша глубина должны быть известны заранее; или вам может потребоваться повторить запрос, чтобы найти остальные записи, если необходимо, см. пункт 1).
  3. Имеют денормализованную информацию av где-то где-то: это может быть денормализованное табличное копирование индексов. Но я предпочел бы кэшированную копию в памяти, которая может быть полностью заполнена только одним запросом и обновлена ​​или недействительна ... в зависимости от ваших других реквизитов, таких как размер таблицы, максимальная глубина, частота записи и т. Д.).
+0

Я обрабатываю это путем записи рекурсивного Fuction, который вызывает запрос HQL – Am1rr3zA

+0

На самом деле существует (стандартный) способ, которым могут выражать большинство основных баз данных это в SQL: рекурсивных общих табличных выражениях. MySQL является одним из немногих, который не поддерживает это. –

1

Можно взглянуть на «вложенные наборы». Запрос становится вопросом «между: L и: R». Но топологическая/иерархическая сортировка теряется (по сравнению с рекурсивными/иерархическими запросами). Вставка новых элементов является довольно дорогостоящей, так как она требует обновлений для нескольких, если не всех строк ...