Nie ma sensu porządkowanie według kolumny, która nie jest częścią wybranego distinct
kolumny.
Ponieważ nie łączysz się z kolekcją, twoje rekordy i tak będą różne (przynajmniej PK będzie się różnić), możesz po prostu pominąć odrębne:
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))
Ogólnie rzecz biorąc, jeśli w zestawie wyników rzeczywiście znajdują się duplikaty i chcesz je wyeliminować, możesz to osiągnąć za pomocą podzapytania:
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))
Inną zaletą tego podejścia jest to, że prawdopodobnie jest ono lepsze pod względem wydajności, ponieważ distinct
łączenie wierszy jest zwykle kosztowną operacją w bazie danych.