# (Hibernate) subquery in FROM-Clause



## LadyMilka (14. Okt 2010)

Hallo, ich hab folgendes HQL-Statement:

```
"SELECT MAX(counter)*0.4 FROM "
+ "(SELECT t2.id, t2.time, (t1.counter - t2.counter) FROM "
    + "(SELECT time, counter "
        + "FROM countervalue WHERE time >= my_date_sub(:zeit, 1, MINUTE) "
        + "AND time <= my_date_add(:zeit, 1, MONTH) "
        + "HAVING (MINUTE(time) MOD 15)=0 )t1, "
    + "(SELECT id, time, counter "
        + "FROM countervalue WHERE time >= my_date_sub(:zeit, 1, MINUTE) "
        + "AND time <= my_date_add(:zeit, 1, MONTH) "
        + "HAVING (MINUTE(time) MOD 15)=0 )t2 "
    + "WHERE t1.time = my_date_add(t2.time, 15, MINUTE)) t"
```
Ich hab diesen Befehl aus einem SQL-Befehl, welcher vorgegeben war.

Nun hab ich rausgefunden, das es in HQL Subqeries gibt, nur leider in im FROM-Clause. Hat jemand eine Idee, die Subqeries zu umgehen? Am liebsten mit HQL (auch mit Dialekt-Erweiterung) aber notfalls auch mit Criterias. (damit muß ich mich dann auch noch beschäftigen)
Ich hab nämlich mehrere Befehle die auch so aufgebaut sind.

Achja, das DB-System ist MySQL und ich nutze Hibernate 3.2.5


----------



## Marcinek (14. Okt 2010)

Das sind keine subquerys sondern inline Select Statements für virtuelle Tabellen.

Normalerweise wäre es besser diese durch views zu ersetzen,.

Maybe kann man damit besser googeln.
Ich würde diese aber immer vermeiden, denn wenn man die macht, dann hat man iwas falsch modelliert.

Gruß,

Marcinek


----------



## LadyMilka (16. Okt 2010)

das Problem ist, das die Datenbank und auch die SQL-Befehle schon vergegeben waren.

nach den "inline selects" werd ich nochmal suchen. ich hab allerdings die vage Vermutung, dass ich um die Criterias nicht drum rum komme -.-


----------



## Marcinek (16. Okt 2010)

Alles was du mit HQL machen kannst, kannst du auch mit Criterias machen und vice Versa.

Sie sind die Elegante Art und Weise Selects mit Hibernate aufzubauen.

Gruß,

Marcinek


----------



## LadyMilka (19. Okt 2010)

Also werd ich mich dann mit den Criterias befassen. Vielen Dank erstmal an dieser Stelle.


----------



## SlaterB (19. Okt 2010)

Criteria kann das genauso wenig wie Marcinek quasi auch ausgedrückt hat


----------



## LadyMilka (19. Okt 2010)

dann muß ich mir überlegen, wie ich den select entsprechend umstelle und trotzdem das gleiche Ergebnis bekomme *seufz*


----------



## LadyMilka (25. Okt 2010)

[edit SlaterB: zweites Thema dazu zusammengeführt]


Hallo, 
der Titel ist vielleicht bisschen unglücklich gewählt, aber was Besseres ist mir nicht eingefallen.

Wenn ich ein Ergebnis einer Abfrage erhalte, kann ich dann darauf erneut Abfragen?
Bsp: 
erste Abfrage: 
	
	
	
	





```
SELECT t2.id, t2.time AS zeit, (t1.counter-t2.counter) AS counter 
FROM t1, t2 WHERE t1.time=DATE_ADD(t2.time, INTERVAL 15 MINUTE)
```
zweite Abfrage: 
	
	
	
	





```
SELECT MAX(counter)*0.4 AS counter FROM <erste Abfrage>
```

Anmerkung: t2 und t1 kommen aus weiteren Abfragen..

Ich möchte allerdings ungern mit Schleifen oder ähnlichem arbeiten.

Edit: derzeit kann ich leider nicht schauen ob was klappt, da seit einer Woche der DB-Server down ist und wohl noch etwas sein wird -.-


----------



## SlaterB (25. Okt 2010)

ich wollt grad schön sparen und auf einen anderen ähnlichen Thread verweisen
http://www.java-forum.org/data-tier/107138-hibernate-subquery-clause.html

aber der ist ja auch von dir, denkst du dass zweimal fragen hilft? 
bzw. wenn das alte nicht ging, dann doch dieser Umweg hier zum gleichen Ziel genausowenig,
HQL kann das nicht, dir steht aber frei die erste Ergebnis-Menge mit Java-Mitteln, mit einer Schleife zu durchlaufen
(edit: ok, hast du auch geschrieben)

eine SQL-ähnliche Anfragesprache innerhalb von Java mit Listen usw., ganz ohne Datenbank, wäre zwar reizvoll, gibt es aber auch noch nicht (soweit ich weiß)


----------



## LadyMilka (25. Okt 2010)

Ich dachte, das wäre eine andere Frage..

Du kannst die Threads auch gerne zusammenführen oder diesen hier dann löschen.

Edit: danke fürs zusammenlegen


----------

