按自定义函数HIBERNATE的结果分组

问题描述 投票:2回答:1

您好,由于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)))"));

并且正在尝试将日期截断到特定时区的日期。非常感谢!

spring hibernate spring-boot jpa
1个回答
1
投票

这里的问题是,在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(...))一起工作的方式,但这至少应该使您入门。

© www.soinside.com 2019 - 2024. All rights reserved.