【问题标题】:Eclipselink group by clause with trunc function具有 trunc 功能的 Eclipselink group by 子句
【发布时间】:2017-01-16 13:55:09
【问题描述】:

我有一个在 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 中不起作用。

任何想法将不胜感激。

【问题讨论】:

  • "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";也不是那样工作,当我尝试不同的事情时,我只是把别名放在最后,没有别名存在同样的问题。适用于 1 个参数,不适用于 true。使用两个不分组的参数,使用一个分组
  • 您的问题应该定义“有效”和“无效”之间的区别 - 是否存在异常、错误结果等。JPQL 解析器可能正在验证 JPQL 并且无法确定函数在同一个子句上运行,在这种情况下,只需使用本机查询即可。

标签: oracle jakarta-ee eclipselink jpql


【解决方案1】:

在您的 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";

【讨论】:

  • 是的,Alias 是一个发布错误,没有它也无法工作。我最后只是尝试了别名,但我无法在这里找到来编辑我的问题。问题仍然存在:使用一个参数(没有 mm 和别名,但使用 group by),它正在工作。有两个参数,不是
  • 您从未提供过实际的错误消息也无济于事。因此,我根据明显行不通的方法来回答。
  • 是有别名还是没有别名?使用别名肯定会给你这个错误。但是使用该功能可能会产生不同的错误。就像我说的,我不是 JPQL 专家。但是有什么方法可以让你看到它被翻译成的实际 SQL 吗?这对于调试错误最有用。
  • 没有,我只是删除了别名。别名之前也存在同样的问题。 builder.append("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"); -> 不工作。删除它正在工作的“mm”,按天分组
  • 编辑了我原来的问题,删除了别名。它从来不想被张贴
【解决方案2】:

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

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

    RETURN TRUNC(dateparam, 'mm');

END;

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

【讨论】:

  • 这样操作...SELECT EXTRACT(month FROM order_date) "Month" FROM orders;
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 2011-01-12
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2015-01-18
  • 1970-01-01
相关资源
最近更新 更多