2015-10-31 70 views
0

傢伙! 我使用JPA(EclipseLink的+德比)在JPQL試圖組查詢結果的時間戳,並將其用於創建結果對象。 我的查詢是:集團通過時間戳JPQL與JPA

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

要組什麼時間範圍?日,時,分? –

+0

根據UserStory,分析師可以選擇研究的時期。因此,我認爲,這意味着必須由包括組同時設置日,月,年濾波器 – ryzhman

回答

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標準,所以你必須使用功能使用您的等同DB函數來執行你想要什麼。下面是更多:https://stackoverflow.com/a/3676865/534877

+0

感謝響應!我曾嘗試過使用technik,但是,由於出現異常導致resultless:函數調用的FUNC和FUNCTION形式拋出java.sql.SQLSyntaxErrorException:列引用'ORDERS.TIMEOFORDER'無效,或者是無效表達式的一部分。對於具有GROUP BY的SELECT列表,所選的列和表達式可能只包含有效的分組表達式和有效的聚合表達式。奇怪的情況下銘記我的EclipseLink有2.5.0.v20130507-3faac2b版本:/ – ryzhman

0

的問題,而只是解決了一個使用功能(「期間」,fieldToTrim)的。 然而分組依據結果,你應該牢記,那期「(不fieldToTrim)必須(!)在SELECT部分​​,不僅在GROUP BY。