Es ist nicht sinnvoll, nach einer Spalte zu sortieren, die nicht Teil des ausgewählten distinct
ist Spalten.
Da Sie keiner Sammlung beitreten, werden Ihre Datensätze sowieso unterschiedlich sein (zumindest PK wird sich unterscheiden), Sie können ganz einfach auslassen:
select distinct city
from City city
where city.id is not null
and upper(city.name) != upper('Unknown')
and city.state.id =:stateId
order by upper(trim(city.name))
Wenn es wirklich Duplikate in der Ergebnismenge gibt und Sie sie eliminieren möchten, können Sie dies im Allgemeinen mit einer Unterabfrage erreichen:
select city
from City city
where city.id in (select c.id from City c join c.someCollection sc where ...)
order by upper(trim(city.name))
Der andere Vorteil dieses Ansatzes ist, dass er wahrscheinlich leistungsmäßig besser ist als distinct
Das Ändern von Zeilen ist normalerweise eine teure Operation in der Datenbank.