【发布时间】: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同时出现在SELECT和GROUP 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