【问题标题】:hibernate - using 'having' without group by clause in hqlhibernate - 在 hql 中使用没有 group by 子句的“有”
【发布时间】:2012-09-27 16:23:10
【问题描述】:

我正在尝试运行一个 hql 查询,该查询汇总(总和)在特定帐户上进行的交易数量,我不需要 group by,因为我的 where 子句具有特定的帐户过滤器(其中 account = :account)

但是,我确实希望仅在聚合值小于/大于某个给定值时才返回聚合值。 当我在没有'group by'的where子句之后添加'have'时,我得到一个错误 - 意外令牌:有

在本机 sql 中,我成功添加了没有 group by 的“有”

关于如何使其与 hql 一起工作的任何想法?

非常感谢

【问题讨论】:

  • 您不想分组的原因是,您也想返回其他不可分组的列?服务器应该如何知道要返回哪一行的列?随机选择一个?
  • 没有group by真的很模糊,
  • 我只需要返回一列,即聚合的一列,因此服务器应该没有问题弄清楚我正在使用 oracle 要返回什么

标签: oracle hibernate


【解决方案1】:

数据库不允许您将分组列与非分组和非聚合列混合的原因是,对于非分组/非聚合列,它必须为每个组选择一行的值,但不会不知道怎么选。

如果你不在乎,那么你可以把它放在一边,如果没关系,因为它们都是一样的,你也可以按它们分组。

【讨论】:

  • 不确定我是否关注。我只返回一列,聚合一列
  • 长话短说:没有 GROUP BY 就没有 HAVING。这仅适用于有问题的数据库。你为什么不想分组呢?
  • 我只想为特定帐户 ID 汇总一列(比如说交易)。因此,如果在我的 where 子句中我写 where account =: account,我没有使用任何分组,当帐户 ID 不在我的表上时我也想返回 0(所以我在帐户表上使用右连接并使用 coalesce ) 感谢您的回复
  • 我还是不明白,你为什么坚持不分组。这就是它的工作方式。
  • 那么就用 where 吧。这是行之有效的方式。 where 定义了在分组之前应用的谓词;定义了在分组之后应用的谓词。在这里,听起来你只想在哪里。
【解决方案2】:

它不是 hql,但如果你有原生查询,那么运行它:

Query query = session.createSQLQuery("select, *** ,... blah blah")
//set If you need
query.setParameter("myparam", "val"); 
List result = query.list();

【讨论】:

    【解决方案3】:

    在我看来,这是无稽之谈。 “拥有”是针对“分组依据”结果的条件完成的。如果不分组,那就没有多大意义了。

    我会说 HQL 做不到。可能 Hibernate 程序员没有想到这个案例,因为他们认为它不重要。

    不管怎样,你不需要它。

    如果它是一个简单的查询,那么你可以在你的 java 代码中决定你是想要结果还是不需要它。

    如果它在子选择中,那么您可以在主选择中使用 where 条件来解决问题。

    如果您认为确实有必要,请您举一个更具体的例子。

    【讨论】:

    • 我想它不是那么重要,只是想知道它是否可以完成。我正在针对另一个对象运行 hql,所以有时我使用 group by,有时不使用。所以,如果没有 group by 时不使用,我将不得不检查我的 java 代码中的值,而当我将使用 group by 时,我必须在我的 java 代码中添加一些逻辑而不是检查返回的值。没什么大不了的,但我认为我可以避免它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2011-09-25
    相关资源
    最近更新 更多