带有trunc功能的Eclipselink group by子句

时间:2016-09-08 14:57:04

标签: oracle java-ee eclipselink jpql

我的查询在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中工作。

任何想法都将受到赞赏。

2 个答案:

答案 0 :(得分:0)

在您的SQL Developer查询中,您按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";

答案 1 :(得分:0)

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

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

    RETURN TRUNC(dateparam, 'mm');

END;

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