No tiene sentido ordenar por una columna que no es parte del distinct
seleccionado columnas.
Dado que no se está uniendo a una colección, sus registros serán distintos de todos modos (al menos PK diferirá), puede omitir distintos:
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))
En general, cuando realmente hay duplicados en el conjunto de resultados y desea eliminarlos, puede lograrlo con una subconsulta:
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))
El otro beneficio de este enfoque es que probablemente sea mejor en términos de rendimiento, ya que distinct
Ingresar filas suele ser una operación costosa en la base de datos.