Hibernate与订单不同

时间:2016-03-10 11:12:11

标签: java hibernate postgresql

任何人都可以告诉我如何在HQL查询中使用distinct with order by。 我一直在寻找解决方案,但似乎找不到确切的解决方案。


这是我的HQL查询

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 DISTINCT,ORDER BY表达式必须出现在选择列表中。

2 个答案:

答案 0 :(得分:2)

按照不属于所选distinct列的列排序是没有意义的。

由于你没有加入一个集合,你的记录无论如何都会是不同的(至少PK会有所不同),你可以省略它们:

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行通常是数据库中昂贵的操作。

答案 1 :(得分:1)

使用此查询。订单不会是双倍的。你必须在一个单独使用它。希望它会对你有所帮助。

按city.name排序,表示它将使用城市名称升序。

select distinct city.name, city.id
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))