1

我正在寻找一种将这条 SQL 语句转换为 @NamedQuery 的智能方法——如果有办法的话?

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

我有一个名为 Record (Hibernate) 的 JPA @Entity。这详细说明了系统中每天创建的所有发票。每个月都会有很多条目。每条记录都会有已付款、逾期、价值以及许多其他信息,例如客户的姓名和地址等。

上面的语句基本上按月总结了所有数据,并总结了每月所有支付发票的价值,总结了 1 月份支付的所有发票,2 月份支付的所有发票等等......结果看起来有点像:

datefield    value
1            4500
2            5500
3            5669

我能想到使用 JPA @NamedQuery 执行此操作的唯一方法是选择表中状态为“已支付”的所有记录,然后使用我的 Java 代码以相当缓慢和丑陋的方式进行排序、排序和添加!有没有一种聪明的方法可以用@NamedQuery 做到这一点?

谢谢

4

1 回答 1

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 从任何其他表一样创建此实体。您可以从视图中进行选择,但无法保存和更新它,但是由于您使用聚合,它无论如何都不像您那样。

于 2013-10-03T09:44:59.117 回答