Cela n'a pas de sens de trier par une colonne qui ne fait pas partie du distinct
sélectionné colonnes.
Puisque vous ne vous joignez pas à une collection, vos enregistrements seront de toute façon distincts (au moins PK sera différent), vous pouvez simplement omettre 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))
En général, lorsqu'il y a vraiment des doublons dans le jeu de résultats et que vous souhaitez les éliminer, vous pouvez y parvenir avec une sous-requête :
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'autre avantage de cette approche est qu'elle est probablement meilleure en termes de performances, car distinct
la création de lignes est généralement une opération coûteuse dans la base de données.