家伙! 我尝试使用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中的字段类型外,还有其他的出路吗?
答案 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)
但year
,month
和day
函数不是jpql标准,因此您必须使用FUNCTION来使用等效的DB函数来执行您想要的操作。还有以下内容:https://stackoverflow.com/a/3676865/534877
答案 1 :(得分:0)
这个问题很简单地通过使用FUNCTION(' period',fieldToTrim)来解决。 然而,GROUPing BY结果,你应该记住,那个时期' (而不是fieldToTrim)必须(!)在SELECT部分,而不仅仅是在GROUP BY中。