我需要在下面生成預期結果。基本上,這是一個按照特定時期彙總值的查詢(每週,每月等)。有一個日期過濾器,開始和結束,我們需要返回所有範圍的值。如果它們不存在,則返回0.處理JPA期間查詢的正確方法是什麼?
在下面的示例中,開始日期是'2015-08-02',日期'2015-08-23'且週期爲每週。請注意,對於第2周,我們沒有值,但應該返回零值。
因此,在這種情況下,使用JPA做到這一點的最佳方法是什麼?我們考慮使用臨時表並將結果與此表結合以獲得整個範圍的結果,但我不知道是否可以使用JPA,因爲我們需要創建表,加入並銷燬臨時表。
另一種選擇是創建數據庫視圖並將其映射到實體。
在上述情況下,JPQL查詢應該是這樣的:
@Query("select status, sum(totalInvoice), week from Invoice where " +
"left join TempTable as tt..." + <-- TEMP TABLE OR VIEW TO GET THE PERIODS
"issuer.id = :issuerId and type = :type and (:recipientId is null or recipient.id = :recipientId) and " +
"status in ('ISSUED', 'PAID') " +
"group by status")
另一種方法是使用存儲過程,但他們似乎很難與JPA實現,我不認爲他們是必要的。
預期結果:
{
"code":"xxx",
"title":"This is the title of the first series"
"type":"PERIODIC",
"period":"WEEKLY", <-- PERIOD
"from":"2015-08-02",
"to":"2015-08-29",
"labels": ["2015-08-02", "2015-08-09", "2015-08-16", "2015-08-23"],
"tabelType": "TEXT",
"series":[
{
"code":"xxx",
"title":"This is the title of the first series"
"values":[10, 0, 13, 18] <- in this example, we don't have values for label "2015-08-09"
},
{
"code":"xxx",
"title":"This is the title of the second series"
"values":[10, 0, 13, 18] <- in this example, we don't have values for label "2015-08-09"
}
]
}
在Postgres裏,這通常用做['SELECT ... FROM generate_series(timestamp_from,timestamp_to,間隔)AS int_start JOIN your_data ON your_data.timestamp_col BETWEEN int_start AND int_start + interval'](https://www.postgresql.org/docs/current/static/functions-srf.html),但我想不出JPA友好的方式(其他比使用原生查詢)。 – pozs
@pozs,是的,如何在JPA上做到這一點是最困難的部分。我想也許使用映射到JPA實體的視圖,但我不知道是否會工作。 –