# Selbstreferenz in Hibernate HSQL



## peez (8. Jan 2010)

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?


----------



## byte (8. Jan 2010)

der primary key von konf ist 
	
	
	
	





```
konf.id
```
.


----------



## peez (8. Jan 2010)

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:


```
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...


----------



## byte (8. Jan 2010)

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.


----------



## peez (8. Jan 2010)

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":

```
__Tabelle Briefings__
Briefing_ID (Primärschlüssel)
Briefing_name
Briefing_Beschreibung
...
```

Dann gibt es eine Tabelle, in der beliebig viele Felder dazu definiert werden:

```
__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.


----------



## SlaterB (8. Jan 2010)

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


----------



## peez (8. Jan 2010)

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 :-(


----------



## SlaterB (8. Jan 2010)

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


----------



## byte (8. Jan 2010)

SlaterB hat gesagt.:


> 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().


----------



## SlaterB (8. Jan 2010)

??
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

```
<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

```
<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

```
<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?


----------



## byte (8. Jan 2010)

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 
	
	
	
	





```
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.


----------

