【问题标题】:How to use distinct in hql如何在 hql 中使用 distinct
【发布时间】:2012-02-09 10:03:20
【问题描述】:

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

String hql = "from product";

在我的产品表中,三列分别是 id、name、section

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

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

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

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

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

【问题讨论】:

  • 你的问题不清楚。你想选择什么?不同产品名称的数量?
  • 我想要具有不同产品名称的产品数据,主键 id 具有不同的值,我需要忽略它们。如果我得到数据,我会自动得到计数

标签: hibernate hql distinct


【解决方案1】:

这是我们使用的 hql 的 sn-p。 (名称已更改以保护身份)

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 会使用 distinct SQL 关键字,但在某些情况下它会使用结果转换器来产生不同的结果。例如,当您使用这样的外连接时:

select distinct o from Order o left join fetch o.lineItems

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

【讨论】:

  • 我需要在同一张表上使用 distinct 但主键 id 有不同的值我想忽略主键值,我只想要产品名称不同值的产品数据,因为名称是重复的。我使用了像 Select distinct p from product p 这样的查询,但它显示了我想要从 product p 查询的所有记录,其中 distinct(p.name) 在休眠中不存在,但我需要这种类型
  • 感谢您的回复 jramay
  • 函数getHibernateTemplate()属于Spring Framework,不属于标准API。你知道不使用 Spring 框架的等价物吗?
【解决方案2】:

我得到了 Hibernate Query Language to use Distinct fields 的答案。您可以使用SELECT DISTINCT(TO_CITY) FROM FLIGHT_ROUTE。如果使用 SQL 查询,则返回字符串列表。您不能通过实体类使用它返回值。因此,解决此类问题的答案是将 HQL 与 SQL 结合使用。

FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID
IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY)";

从 SQL 查询语句中得到DISTINCT ROUTE_ID 并作为列表输入。并且 IN 查询从 IN (List) 中过滤出不同的 TO_CITY。

返回类型是Entity Bean类型。所以你可以在 AJAX 中,比如 AutoComplement。

【讨论】:

    猜你喜欢
    • 2018-01-01
    • 2023-04-05
    • 1970-01-01
    • 2012-10-21
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多