如何在hql中使用distinct

时间:2012-02-09 10:03:20

标签: hibernate hql distinct

我正在使用Hibernate,struts和extjs开发Web应用程序, 这是我的情景。

String hql = "from product";

在我的产品表中,有三列是id,name,section

我需要基于产品的不同名称的结果,但我只有选择是编写hql没有其他选项。

我可以使用group by但我需要结果的大小

所以我使用hql.list().get(0);

在上面的代码中,代码是常见的方法,即每个dao都使用相同的方法。

我可以使用连接,但数据是数百万,因此查询执行速度太慢, 所以任何人都可以帮助我如何在hql中编写不同的关键字。

2 个答案:

答案 0 :(得分:0)

这是我们使用的一段hql。 (名称已更改为保护身份)

String queryString = "select distinct f from Foo f inner join foo.bars as b" +
                " where f.creationDate >= ? and f.creationDate < ? and b.bar = ?";
        return getHibernateTemplate().find(queryString, new Object[] {startDate, endDate, bar});

值得注意的是,HQL中的“distinct”关键字不会直接映射到SQL中的“distinct”关键字。

如果在HQL中使用“distinct”关键字,则有时Hibernate将使用不同的SQL关键字,但在某些情况下,它将使用结果转换器来生成不同的结果。例如,当您使用这样的外部联接时:

从Order o left join fetch o.lineItems

中选择不同的o

在这种情况下,无法在SQL级别过滤掉重复项,因此Hibernate在执行SQL查询后使用resultTransformer来过滤重复项。

答案 1 :(得分:0)

我有一个Hibernate查询语言的答案,可以使用Distinct字段。您可以使用SELECT DISTINCT(TO_CITY) FROM FLIGHT_ROUTE。如果使用SQL查询,则返回String List。您不能通过实体类使用它返回值。所以解决这类问题的答案是使用HQL和SQL。

  

FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID
  IN(从SF.TO_CITY中选择SF_ROUTE_ID来自FLIGHT_ROUTE SF GROUP)“;

从SQL查询语句中获取DISTINCT ROUTE_ID并输入为List。 IN查询从IN(List)过滤掉不同的TO_CITY。

返回类型是实体Bean类型。所以你可以在AJAX中使用它,例如AutoComplement。