【问题标题】:How to avoid duplicating a function call in this JPA/JPQL query?如何避免在此 JPA/JPQL 查询中重复函数调用?
【发布时间】:2019-04-28 19:51:40
【问题描述】:

我有以下 JPA 查询将日期截断为整小时并计算它们:

SELECT a.alertconfiguration.id.id,
       date_trunc('hour', a.date) AS fromDate,
       count(*)                   AS count
FROM   alert a
GROUP  BY a.alertconfiguration.id.id,
          a.alertlevel,
          date_trunc('hour', a.date)

我正在使用 Hibernate 在 Spring Boot 应用程序中运行它。它工作正常。但我不想将函数调用复制到date_trunc。 我曾尝试在 GROUP BY 子句中引用 fromDate 但随后出现异常org.postgresql.util.PSQLException: ERROR: column "fromdate" does not exist

http://hibernate.atlassian.net/browse/HHH-9301 还声明不能在 group by 子句中引用别名。

如何在没有重复函数调用的情况下重写我的查询?

【问题讨论】:

  • 你为什么认为date_trunc同时出现在SELECTGROUP BY子句中必然意味着数据库实际上调用了它两次?避免这种情况的唯一方法是在子查询中生成fromDate。但是,这会对性能产生严重影响。我对您当前的版本很满意。
  • @TimBiegeleisen 也许不一定,我不知道它是否可以优化它,我对此知之甚少。我不喜欢重复通话,但如果这对其他人来说听起来很合理,那么我不会特别介意。
  • 当您调用GROUP BY 时,您将数据库置于GROUP BY 模式。它需要在执行查询时保留GROUP BY 子句中使用的术语。所以,我的观点是,这里可能只需要 一个 调用date_trunc
  • 你可以尝试在 group by 子句中使用 2 而不是 date_trunc('hour', a.date) 吗,因为 fromdate 是第二列?
  • @RamachandraReddy 是的,这也确实有效!你应该把它变成一个答案,这样我才能接受。

标签: java postgresql hibernate jpa jpql


【解决方案1】:

Hibernate 不适用于 group by 或任何聚合函数中的别名。正如您将在生成的 sql 查询中看到的那样,别名与您分配的不同。

【讨论】:

  • 那我该怎么办?
  • 你需要复制你的 date_trunc 函数。对此存在 jira 缺陷。在谷歌上搜索。
【解决方案2】:

你可以尝试在 group by 子句中使用 2 而不是 date_trunc('hour', a.date),因为 fromdate 是第二列

【讨论】:

    猜你喜欢
    • 2020-08-08
    • 2016-06-28
    • 2011-07-25
    • 1970-01-01
    • 2016-07-06
    • 2019-05-03
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多