Няма смисъл да се подрежда по колона, която не е част от избрания distinct
колони.
Тъй като не се присъединявате с колекция, вашите записи така или иначе ще бъдат различни (поне PK ще се различава), можете просто да пропуснете distinct:
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))
По принцип, когато наистина има дубликати в набора от резултати и искате да ги елиминирате, можете да го постигнете с подзаявка:
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))
Другото предимство на този подход е, че той вероятно е по-добър по отношение на производителността като distinct
редове обикновено е скъпа операция в базата данни.