按自定义函数HIBERNATE的结果分组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按自定义函数HIBERNATE的结果分组相关的知识,希望对你有一定的参考价值。
您好,由于Hibernate中的自定义功能,分组有一些问题。查询看起来像:
@Query("SELECT NEW ReportDay(" +
"FUNCTION('atTimezone', p.startDate, :timezone), "
"SUM(p.energy)) " +
"FROM Process p GROUP BY FUNCTION('atTimezone', p.startDate, :timezone)")
引发的错误是p.startDate必须出现在groupBy子句或聚合函数中。但是自定义功能在group by子句中。
有什么想法吗?自定义函数是这样的:
registerFunction("atTimezone", new SQLFunctionTemplate(StandardBasicTypes.TIMESTAMP,"date_trunc('day', (cast(?1 as timestamp) AT TIME ZONE cast(?2 as varchar)))"));
并且正在尝试将日期截断到特定时区的日期。非常感谢!
答案
这里的问题是,在SQL中,两个时区参数将是单独的参数,并且您的数据库(至少是PostgreSQL)将无法识别出它们实际上是相同的值。
为了解决此问题,您可以为函数赋予别名,该别名可以在GROUP BY子句中引用。根据ANSI SQL和JPQL,GROUP BY
子句中不允许使用选择别名。但是,某些数据库方言(如PostgreSQL,mysql和H2)确实支持它,并且由于group by子句中的Hibernate 5.4.10别名被传播到这些支持方言(HHH-9301)的SQL查询。
所以代替:
SELECT FUNCTION('atTimezone', p.startDate, :timezone), SUM(p.energy)) FROM Process p GROUP BY FUNCTION('atTimezone', p.startDate, :timezone)
您可以做:
SELECT FUNCTION('atTimezone', p.startDate, :timezone) AS d, SUM(p.energy)) FROM Process p GROUP BY d
我不知道这与对象投影(
NEW ReportDay(...)
)一起工作的方式,但这至少应该使您入门。
以上是关于按自定义函数HIBERNATE的结果分组的主要内容,如果未能解决你的问题,请参考以下文章