您好,由于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(...)
)一起工作的方式,但这至少应该使您入门。