2013-10-03 23 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