2009-08-02 9 views
1

Ich habe diese Tabellerekursive Abfrage mit 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`); 

wie Sie jede Tabelle einen Fremdschlüssel hat sehen können, die auf andere Zweig Row (Selbst Relation) zeigen Ich möchte eine Abfrage HQL mit (bevorzugen HQL) zu Erhalte einen Benutzernamen (oder eine ID) von mir und gebe eine List<String> (für Benutzername) oder List<Integer> (für ID) zurück, die eine Liste aller meiner subBranch war;

lassen Sie mich in Beispiel zeigen

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 

, wenn ich rufe GetSubBranch (3) Ich zurückkehren wollen:

5, 6 

und wenn Anruf GetSubBranch (2) I zurückkehren wollen:

4, 7, 8 

Antwort

1

Ich glaube, dass es dafür kein portables SQL gibt. Noch mehr, ich denke, mehrere SQL-Datenbanken der großen Datenbanken können dies nicht ausdrücken.

Daher ist diese Fähigkeit nicht Teil von was Sie in HQL tun können. Sorry :-(

Ich lese ein paar Wege zu gehen.Die meisten von ihnen beinhalten Kompromisse abhängig von der Anzahl der Ebenen (im Voraus festgelegt? Wie viele?), Die Anzahl der Datensätze (Hunderte? Millionen?) Etc:

.
  1. tun, um die rekursive Abfragen selbst, nach unten Nivellierung jedes Mal (mit in(ids)), bis ein Niveau leer
  2. eine Abfrage Sie mit einer festen Anzahl von links schließt sich (Ihre Tiefe müssen im Voraus bekannt sein; oder Sie müssen die Abfrage ggf. wiederholen, um bei Bedarf die restlichen Datensätze zu finden, siehe Punkt 1)
  3. Haben Sie die denormalisierte Information av irgendwo verfügbar: es könnte eine denormalisierte Tabellenkopie der Indizes sein. Aber ich bevorzuge eine zwischengespeicherte In-Memory-Kopie, die komplett in nur einer Anfrage ausgefüllt und aktualisiert oder ungültig gemacht werden kann ... abhängig von Ihren anderen Requisiten, wie der Tabellengröße, der maximalen Tiefe, der Schreibfrequenz usw.).
+0

Ich handle es durch schreiben rekursive Fuction, die HQL-Abfrage aufrufen – Am1rr3zA

+0

Tatsächlich gibt es eine (Standard) Möglichkeit, in der die meisten großen Datenbanken ausdrücken können dies in SQL: rekursive allgemeine Tabellenausdrücke. MySQL ist einer der wenigen, die dies nicht unterstützen. –

1

Man kann sich "verschachtelte Sets" ansehen. Abfragen wird eine Frage von "zwischen: L und: R". Die topologische/hierarchische Sortierung geht jedoch verloren (im Vergleich zu rekursiven/hierarchischen Abfragen). Das Einfügen neuer Elemente ist dann ziemlich kostspielig, da es Updates für mehrere, wenn nicht alle Zeilen erfordert ...