Selbstreferenz in Hibernate HSQL

peez

Bekanntes Mitglied
Ich will gerade was mit Hibernate probieren. In einer Mappingdatei habe ich folgende Zeile:

[XML]<property name="AnzahlFelder" formula="select count(konf.brkoId) from Konfiguration konf Where fremdId=HIERMUSSNESELBSTREFERENZHIN" type="java.lang.Integer" />[/XML]

Wie kann ich denn die referenz auf das Objekt selbst - also "this" im generierten Code bekommen? Geht das denn überhaupt?
 
Ja aber ich will dass die Anzahl der Felder nur für das Objekt ausgegeben wird, auf das getAnzahlFelder() aufgerufen wird.

Also wenn man sich die resultierende Java Klasse vorstellt was in der art:

Java:
class Konfiguration {

  //.....

  public Integer getAnzahlFelder() {
    String sql = "SELECT count(*) AS menge FROM konfiguration WHERE fremdId=" + this.getId();
    //... Ausführen 
    Integer anzahl = rs.getInt("menge");
    return anzahl;
  }
}

dieses this.getId() müsste ich irgendwie abgebildet bekommen...
 
konf.id ist analog zu this.id, bezoge auf das SQL.

Verstehe nicht so genau, was Du überhaupt machen willst. Was ist fremdId? Ein Foreign Key in der Datenbank? Das kannst Du so per HQL gar nicht ansprechen. HQL bezieht sich immer nur auf die gemappte Klasse und nicht auf die Datenbanktabelle.
 
Ja ist mir beim Schreiben auch aufgefallen, dass das schwer zu erklären ist ;-)

Also ich mach mal ein einfaches Szenario (Achtung: mit neuen Bezeichnungen etc.):

Ich habe in der Datenbank eine Tabelle mit "Briefings":
Code:
__Tabelle Briefings__
Briefing_ID (Primärschlüssel)
Briefing_name
Briefing_Beschreibung
...

Dann gibt es eine Tabelle, in der beliebig viele Felder dazu definiert werden:
Code:
__Tabelle Felder__
Feld_ID
Briefing_ID
Feld_Beschreibung
Feld_Typ
...

Jetzt möchte ich gerne zu jedem Briefing auslesen können, wieviele Felder dazu existieren.
Dazu habe ich versucht den o.g. HQL Part in das Hibernate mapping für Briefing einzufügen:

[XML]<property name="AnzahlFelder" formula="select count(feld.Feld_ID) from Feld feld Where BriefingId=<this.id>" type="java.lang.Integer" />[/XML]
Hier braucht ja briefingId die ID des konkreten Objekts, auf dem getAnzahlFelder() aufgerufen wird.
 
was gibt es da nicht zu verstehen?
wenn man im Mapping einer Hibernate-Klasse ein formula-Tag mit einer Query, ob SQL oder HQL, angeben kann,
dann muss die sich doch irgendwie auf das aktuelle Element beziehen, 'select count(*) from beliebigeTabelle' wäre eher langweilig

nach
Hibernate 3 Formulas - O'Reilly Media
sieht es so aus, als müsste man einfach id schreiben, sofern der eigene Primary-Key so definiert ist, alles ohne Tabellen-Kürzel scheint sich auf das eigene Objekt zu beziehen
 
Genau so hab ichs gemeint.

Allerdings stehe ich jetzt vor dem nächsten Problem: Funktioniert das überhaupt grundsätzlich so mit dem formula attribut? Nachdem mein direktversuch nicht funktioniert hat, habe ich jetzt das hier versucht:

[XML]<property name="AnzahlFelder" formula="select 1" type="java.lang.Integer" />[/XML]

will leider nicht :-(
 
kann ich nicht sagen, ich würde auf jeden Fall immer erst Beispiele im Netz suchen, vielleicht ist irgendeine kleine Syntax zu beachten,

wie ich gerade sehe, gehts in dem Link von mir gar nicht um normale Properties, sondern um discriminator, später many-to-one,
aber es wird sich bei google sicher noch anderes finden lassen, falls es sowas überhaupt gibt
 
was gibt es da nicht zu verstehen?
wenn man im Mapping einer Hibernate-Klasse ein formula-Tag mit einer Query, ob SQL oder HQL, angeben kann,
dann muss die sich doch irgendwie auf das aktuelle Element beziehen, 'select count(*) from beliebigeTabelle' wäre eher langweilig

Ja, und das habe ich auch schon längst oben beantwortet.

from Konfiguration konz

dann ist konz das eigentliche Objekt und konz.id der Primary Key, also analog zu this.getId().
 
??
das erscheint mir ohne Sinn,
nach welchem System sollte das so funktionieren und was würde das leisten?

im Mapping einer Klasse Konfiguration würde
Code:
<property name="AnzahlFelder" formula="select count(*) from Konfiguration konf" type="java.lang.Integer" />
dann was sein? immer 1 da ja konf automatisch nur das eigene Objekt ist?

----

was ist wenn man andere Konf-Objekte zählen möchte, die z.B. mit dem eigenen Objekt per Zwischentabelle verbunden sind
Code:
<property name="AnzahlFelder" formula="select count(*) from Konfiguration konf, KonfToKonf ktk, Konfiguration konf2 
where konf.id = ktk.idHoeher and ktk.idTiefer =  konf2.id" type="java.lang.Integer" />
?
auch andersrum wäre es ein interessante Abfrage
Code:
<property name="AnzahlFelder" formula="select count(*) from Konfiguration konf, KonfToKonf ktk, Konfiguration konf2 
where konf2.id = ktk.idHoeher and ktk.idTiefer =  konf.id" type="java.lang.Integer" />

einmal wird abgefragt, wieviele andere Konfigurationen untergeordnet sind, das andere mal wie viele drüber stehen,
woran erkennt nun Hibernate, was 'das eigene Objekt' ist, konf oder konf2?
 
Zuletzt bearbeitet von einem Moderator:
OK, jetzt habe ich verstanden, was Du meinst. Da es sich in diesem Fall ja um SQL handelt und nicht um HQL, müsste <this.id> einfach der Column Name sein, der auch im Mapping definiert ist, also
Code:
Briefing_ID
(ohne Alias).

EDIT: Hm, scheint auch nicht zu funktionieren. Guck mal in die Hibernate Doku in Abschnitt 23.4, da sind einige Beispiele.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben