HQL Subselects in FROM-Clause

ablake27

Mitglied
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...
 
Zuletzt bearbeitet von einem Moderator:

fastjack

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

Code:
select * from Orders order by material
???

Beschreib doch mal was du eigentlich machen wilst.
 

ablake27

Mitglied
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

Bekanntes Mitglied
Code:
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:
Code:
select * from Orders
order by o.material
Hätte die gleiche Wirkung.
 

ablake27

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


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
LadyMilka (Hibernate) subquery in FROM-Clause Data Tier 9

Ähnliche Java Themen

Neue Themen


Oben