# HQL Subselects in FROM-Clause



## ablake27 (28. Apr 2011)

Ist es möglich in HQL sowas abzubilden:

select * from (select * from Orders) o 
order by o.material

Der 'select * from Orders' Part ist die Urquery und soll unveränderbar sein. Zum Filtern und sortieren soll sie wie oben gezeigt ummantelt werden.

HQL unterstütz leider keine Subselects in der FROM-Clause...


----------



## fastjack (2. Mai 2011)

Verstehe ich nicht... select ist sowieso unveränderbar, da wird nix manipuliert. Warum nicht einfach so:


```
select * from Orders order by material
```
 ???

Beschreib doch mal was du eigentlich machen wilst.


----------



## ablake27 (2. Mai 2011)

In einer Anwendung werden Daten mit Hibernate abgefragt und in JTables dargestellt. Basis der Abfragen sind meistens recht komplexe HQL-Queries. Der Benutzer sieht das Ergebnis in einer JTable und soll die Möglichkeit haben, durch Klick auf Spalten-Header das Ergebnis sortiert anzuzeigen. Das Ursprüngliche HQL Statement darf nicht geändert werden, da es selbst bereits etliche Filter- und Sortierkriterien enthält und bei Bedarf wieder abgerufen werden muss. Wenn der User auf den Header klickt soll ungefähr sowas passieren (in SQL möglich) select * from (select * from Orders o where ...) order by o.geklickteSpalte. 

Da ich es mit dutzende  Masken zu tun habe, die diese Funktionalität brauchen, strebe ich eine einmalige Implementierung in einer Oberklasse  an (Es gibt eine Oberklasse von der alle Kundendialoge abgeleitet sind). Ich möchte nicht hundert Kundendialoge anpassen müssen.


----------



## brauner1990 (2. Mai 2011)

```
select * from (select * from Orders) o
order by o.material
```
Das geht nich bei HSQL, korrekt.

Das geht aber in keiner SQL Sprache nach meinem Wissen. Du musst schon immer eine Tabelle angeben von der er lesen soll, dein Subselect geht aber in der Where - Bedingung, wenn ein bestimmtes Feld ausgewählt wurde auf das verglichen werden soll.

Dein SQL Befehl könnte aber auch wie folgt aussehen:

```
select * from Orders
order by o.material
```
Hätte die gleiche Wirkung.


----------



## ablake27 (2. Mai 2011)

Mir ist klar, daß die folgenden Statements die gleiche Wirkung haben:

1. select * from ORDERS o order by o.material
2. select * from (select * from ORDERS) o order by o.material

Nr.2 funktioniert unter Oracle und SQL-Server einwandfrei, es gibt aber sicher auch DBs die das nicht können.

Mein erster Ansatz (funktioniert nicht):
Ursprüngliches HQL-Statement unverändert belassen und zusätzliche Where- oder OrderBy-Bedingungen drum herum bauen.

Bspl: select y from (select y from Orders) where … order by …

Diese Query ist aber im HQL-Kontext ungültig, da  Hibernate keine Subqueries in der FROM-Clause unterstützt.

2.Ansatz (hat auch nicht funktioniert)
Query anders formulieren: Subquery in die WHERE-Clause verschieben.

Bspl: select y from Orders y where y in (select x from Orders x)

Die Query funktioniert auch unter Oracle. Unter SQL-Server aber nicht, da das generierte SQL von SQL-Server nicht unterstützt werden (Soviel zum Thema Datenbankunabhängigkeit). 

Hibernate übersetzt in ungefähr so ein SQL Statement

select * from Orders  where  (o.key1, o.key2, o.key3) 
in (   select    (o.key1, o.key2, o.key3)  from  Orders  o)

Um genau zu sein, wird das generierte Statement von SQL-Server nur unterstütz wenn der PK ein Einzelwert und nicht zusammengesetzt ist. SQL-Server erlaubt an der Stelle "in ... (o.key1, o.key2, o.key3)" nur Einzelwerte. Da das Statement generiert wird gibt es auch keine Möglichkeit darauf Einfluss zu nehmen.


----------



## brauner1990 (3. Mai 2011)

Dann kann ich dir leider nicht weiterhelfen...wusst nichmal das dies dort funktioniert.


----------



## SlaterB (3. Mai 2011)

in SQL ist das übrigens meiner Ansicht nach Standard
MySQL :: MySQL 5.0 Reference Manual :: 12.2.9.8 Subqueries in the FROM Clause


----------

