使用JPA在jpql中按时间戳分组

时间:2015-10-31 16:48:47

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

家伙! 我尝试使用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中的字段类型外,还有其他的出路吗?

2 个答案:

答案 0 :(得分:2)

您的查询必须如下所示:

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

答案 1 :(得分:0)

这个问题很简单地通过使用FUNCTION(' period',fieldToTrim)来解决。 然而,GROUPing BY结果,你应该记住,那个时期' (而不是fieldToTrim)必须(!)在SELECT部分​​,而不仅仅是在GROUP BY中。