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 可以正常工作。
我有一个在 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 可以正常工作。