# Problem mit HQL Syntax



## MZ3291 (13. Jun 2012)

Hallo 

Ich versuche verzweifelt eine Liste von Objekten aus einer Datenbank zu holen was mir leider nicht gelingen will.
Das Schema sieht in etwa wie folgt aus:

Das Objekt Container hat 2 Sets:
 ein Set mit Objekten vom Typ Objekt1
 ein Set mit Objekten vom Typ Objekt2

Es kann vorkommen, dass ein Objekt1 von einem Objekt2 "überschrieben" wird -> in diesem Fall hat Objekt1 eine Referenz von Objekt2. 
Davon abgesehen gibt es aber auch Objekt2 Objekte, die kein Objekt1 überschreiben.
-> Und genau um die geht es mir !

ich habe versucht das folgender maßen mit HQL zu lösen:


```
SELECT c.Objekte2 FROM Container c WHERE c.id = :ContainerId AND NOT( c.Objekte2 IN 
( SELECT o.Objekte2 FROM c.Objekte1 o ) )
```

Mit SQL konnte ich es lösen, aber das auf HQL umzumünzen ist nicht ganz so einfach und ich finde einfach keine lösung..

Grüße und danke für Hilfe im Voraus..
MZ


----------



## diel2001 (13. Jun 2012)

Liegt es vielleicht daran ? 
Objekt1 !=  Objekte1
Objekt2 !=  Objekte2


----------



## MZ3291 (13. Jun 2012)

Den Einwand versteh ich irgendwie nicht richt richtig.. 
Meinst du, dass ich einzelne Objekte mit Sets von Objekten vergleiche ?? 
Glaube, mein Problem liegt hauptsächlich an meinen mangelnden HQL-Kenntnissen und dass ich nicht weiß, wie ich das ausdrücken soll, was sich in meinem Kopf befindet und mit SQL funktioniert.. 

Hier übrigens mal eine neue Idee die auch nicht geht:

```
SELECT c.Objekte2 FROM Container c JOIN c.Objekte1 o WITH c.id = :ContainerId AND NOT( o.Objekt2 IN c.Objekte2 )
```


----------



## MZ3291 (13. Jun 2012)

Vllt hilft es ja wenn ich die funktionierende SQL - Query poste:
dabei haben die Objekte Objekt1 und Objekt2 die container_id als Fremdschlüssel.. und Objekt1 hat außerdem ein originalObjekt_id als fremdschlüssel, der auf das "überschriebene" Objekt zeigt..


```
SELECT o2.* FROM Objekt2 o2 JOIN Container c ON o2.container_id = c.id WHERE c.id = :containerId AND o2.id NOT IN 
(SELECT o2.id FROM o2 JOIN Objekt1 o1 ON c.id = o1.originalObjekt_id WHERE o1.container_id = :containerId)
```


----------



## SlaterB (13. Jun 2012)

hier noch eine gewisse Richtung nach alldem was in
Chapter*14.*HQL: The Hibernate Query Language
steht, musss aber nicht gleich richtig sein:

[sql]
SELECT o2 from Container c inner join c.Objekte2  as o2
WHERE c.id = :ContainerId 
AND o2 NOT IN  (SELECT o1.Objekte2  from Container cc inner join c.Objekte1  as o1 where cc = c )
[/sql]

wobei:
'o1.Objekte2' ist jeweils wieder eine Menge, oder sind das einzelne Elemente?
bei Menge könnten noch mehr Joins nötig sein..


----------



## MZ3291 (13. Jun 2012)

Nein es ist keine Menge ..

Habe es gerade gelöst ^.^

Für die die es interessiert:

```
SELECT o2 FROM Container c INNER JOIN c.Objekte2 AS o2
WHERE c.id = :containerId
AND o2 <> (SELECT o1.Objekt2 FROM c.Objekte1 AS o1)
```

war also schon nahe dran @SlaterB
;D


----------

