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.