按自定义函数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的结果分组的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 按自定义频率分组并获取索引组

python 按自定义lambda函数排序

在 Eloquent 中按自定义顺序对集合进行排序 [重复]

按自定义模式排序列

使用 dplyr 按自定义顺序排列行

Woocommerce 集团订单总额按自定义字段日期