Eclipselink group by 带有 trunc 函数的子句

Eclipselink group by clause with trunc function

我有一个在 sqldeveloper 中有效的查询,但在 jpql (eclipselink 2.6) 中无效。

select trunc(SYS_CR_DT, 'mm'), count(trunc(SYS_CR_DT, 'mm')) from A
group by trunc(SYS_CR_DT, 'mm')
order by trunc(SYS_CR_DT, 'mm') DESC;

这在 sqldeveloper 中有效,但这不是(在 jpql 中),说它不是按表达式分组:

"SELECT FUNCTION('TRUNC', lh.sysCreateDate, 'mm'), COUNT(FUNCTION('TRUNC', lh.sysCreateDate, 'mm')) "
        + " FROM A lh"
        + " GROUP BY FUNCTION('TRUNC', lh.sysCreateDate, 'mm')"
        + " ORDER BY FUNCTION('TRUNC', lh.sysCreateDate, 'mm') DESC";

这也有效,因此使用该功能进行分组是有效的:

"SELECT FUNCTION('TRUNC', lh.sysCreateDate), COUNT(FUNCTION('TRUNC', lh.sysCreateDate)) "
        + " FROM A lh"
        + " GROUP BY FUNCTION('TRUNC', lh.sysCreateDate)"
        + " ORDER BY FUNCTION('TRUNC', lh.sysCreateDate) DESC";

这也有效,所以不是第二个参数的问题,而是分组的问题:

"SELECT FUNCTION('TRUNC', lh.sysCreateDate, 'mm'), COUNT(FUNCTION('TRUNC', lh.sysCreateDate, 'mm')) "
        + " FROM A lh"

长话短说:当我添加第二个参数时,它仍然是一个有效的函数调用,但在 group by 内部不起作用。

如有任何想法,我们将不胜感激。

在您的 SQL 开发人员查询中,您按 trunc(SYS_CR_DT, 'mm') 分组,而在您的 jpql 查询中,您按 month 分组。所以,实际上,这些不是同一个查询,比较它们是不公平的。

问题是,在 Oracle 中,select 子句中定义的别名(即:month)不能在 group by 子句中引用。原因很简单:group by 子句在 select 子句 之前被处理 。 (在 order by 子句中使用别名是可以的,因为 order by 子句最后处理)

我不是 jpql 专家,但我想你需要做类似的事情:

"SELECT FUNCTION('TRUNC', lh.sysCreateDate, 'mm') AS month, COUNT(FUNCTION('TRUNC', lh.sysCreateDate, 'mm')) "
        + " FROM A lh"
        + " GROUP BY FUNCTION('TRUNC', lh.sysCreateDate, 'mm')"
        + " ORDER BY month DESC";

所以我无法解决问题,对我来说似乎是一个错误。 无论如何,我成功了。不是一个很好的解决方案,但我能做什么。

CREATE OR REPLACE FUNCTION TRUNCBYMONTH(
    dateparam DATE
)
RETURN DATE
AS
BEGIN

    RETURN TRUNC(dateparam, 'mm');

END;

使用 'mm' 额外参数调用此函数而不是原来的 TRUNC 可以正常工作。