2013-10-03 43 views
1

我正在尋找一種智能方式將此SQL語句轉換爲@NamedQuery - 如果有辦法呢?SQL到JPA @NamedQuery轉換

SELECT MONTH(dateField), sum(value) FROM mydb.records where status ='paid' group by MONTH(dateField) order by MONTH(dateField); 

我有一個名爲Record(Hibernate)的JPA @實體。這詳細介紹了系統中每日創建的所有發票。每個月會有很多條目。每個記錄將具有支付,逾期,價值以及許多其他信息(諸如客戶的姓名和地址等)的狀態等。

上述說明基本上總結了所有月份數據和總和每月都支付的發票giveing一月支付的所有發票的摘要的值,都在二月支付等等.....結果看起來像出頭:

datefield value 
1   4500 
2   5500 
3   5669 

我能想到的唯一的辦法使用JPA @NamedQuery這樣做是爲了選擇狀態爲'pai'd的表中的所有記錄,然後使用我的Java代碼以相當緩慢和難看的方式進行排序,排序和添加!有沒有一種聰明的方法,我可以用@NamedQuery來做到這一點?

由於

回答

1

MONTH()不在JPA規範中定義的標準JPQL功能,但是存在另一種。

在您的數據庫中查看利用您的數據庫月份功能的視圖。

create view MONTLY_REVENUE as 
    SELECT MONTH(dateField), 
     sum(value) 
    FROM mydb.records 
    where status ='paid' 
    group by MONTH(dateField) 
    order by MONTH(dateField); 

然後就像從任何其他JPA表中創建此實體一樣。您可以從視圖中進行選擇,但無法保存並更新它,但是由於您使用的聚合方式與您不一樣,因此無論如何。

+0

感謝您的快速回復凱文,看起來很棒,比我的Java循環更簡單!所以這個新的'視圖'會自動映射到我創建的JPA'@'實體MONTHLY_REVENUE {}。然後在@ @ Entity MONTHLY_REVENUE中選擇全部的'@'NamedQuery將產生結果? – user1843591

+0

@ user1843591沒錯。 –

+0

嗨凱文,我可以添加一個'動態'值或動態參數的視圖?例如查看你描述的..xxx,其中status ='paid'和vendorid = $ {} ....我簡化了我原來的問題。原始解決方案將彙總所有供應商的所有發票。我允許供應商登錄並查看他們的數據,但它全部存儲在一個表中,所以我只想按供應商的供應商基礎進行彙總... – user1843591