Non ha senso ordinare in base a una colonna che non fa parte del distinct
selezionato colonne.
Dal momento che non ti unisci a una raccolta, i tuoi record saranno comunque distinti (almeno PK sarà diverso), puoi semplicemente omettere distinti:
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))
In generale, quando ci sono davvero dei duplicati nel set di risultati e vuoi eliminarli, puoi ottenerlo con una sottoquery:
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))
L'altro vantaggio di questo approccio è che probabilmente è migliore in termini di prestazioni, in quanto distinct
L'inserimento di righe è solitamente un'operazione costosa nel database.