【问题标题】:Group by timestamp in jpql with JPA使用 JPA 在 jpql 中按时间戳分组
【发布时间】:2015-10-31 16:48:47
【问题描述】:

伙计们! 我正在尝试使用 JPA(EclipseLink + Derby)按 JPQL 中的时间戳对查询结果进行分组,并将它们用于创建 Result 对象。 我的查询是:

Select new com.restaurant.entities.Report(o.timeOfOrder, count(o.id), sum(o.price))";
    queryText+=" from Orders o ";
    queryText+="where o.timeOfOrder BETWEEN :start AND :end";
    queryText+=" group by o.timeOfOrder"

不幸的是,只有一毫秒会产生巨大的差异,因此按 o.timeOfOrder 进行简单分组是行不通的。

我试过this approach,但是我有

Internal Exception: java.sql.SQLSyntaxErrorException: Column reference 'ORDERS.TIMEOFORDER' is invalid, or is part of an invalid expression.  For a SELECT list with a GROUP BY, the columns and expressions being selected may only contain valid grouping expressions and valid aggregate expressions.

或许,除了改变DB中的字段类型,还有其他的出路吗?

【问题讨论】:

  • 您要分组的时间范围是什么?到天、时、分?
  • 分析师可以根据UserStory选择研究周期。因此,我想,这意味着 group by 必须同时包含一组日、月和年过滤器

标签: java jpa sql-order-by derby jpql


【解决方案1】:

您的查询必须如下所示:

Select new com.restaurant.entities.Report(o.timeOfOrder, count(o.id), sum(o.price)) 
from Orders o 
where o.timeOfOrder BETWEEN :start AND :end 
group by year(o.timeOfOrder), month(o.timeOfOrder), day(o.timeOfOrder)

但是yearmonthday 函数不是 jpql 标准,因此您必须使用 FUNCTION 来使用等效的 DB 函数来执行您想要的。更多内容:https://stackoverflow.com/a/3676865/534877

【讨论】:

  • 感谢您的回复!我已经尝试过您提到的技术,但是由于异常而没有结果:FUNC 和 FUNCTION 形式的函数调用都抛出 java.sql.SQLSyntaxErrorException: Column reference 'ORDERS.TIMEOFORDER' 无效,或者是无效表达式的一部分。对于带有 GROUP BY 的 SELECT 列表,被选择的列和表达式只能包含有效的分组表达式和有效的聚合表达式。奇怪的情况是我的 EclipseLink 有 2.5.0.v20130507-3faac2b 版本:/
【解决方案2】:

使用 FUNCTION('period', fieldToTrim) 即可轻松解决该问题。 但是 GROUPing BY 结果,您应该记住,“句点”(不是 fieldToTrim)必须(!)在 SELECT 部分中,而不仅仅是在 GROUP BY 中。

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2023-03-23
    • 2022-01-16
    • 2018-09-04
    • 2011-10-13
    • 2014-05-31
    相关资源
    最近更新 更多