SQL到JPA@NamedQuery的转换
我正在寻找一种智能的方法将这个SQL语句转换成@NamedQuery——如果有办法的话SQL到JPA@NamedQuery的转换,sql,hibernate,jpa,relational-database,java-ee-6,Sql,Hibernate,Jpa,Relational Database,Java Ee 6,我正在寻找一种智能的方法将这个SQL语句转换成@NamedQuery——如果有办法的话 SELECT MONTH(dateField), sum(value) FROM mydb.records where status ='paid' group by MONTH(dateField) order by MONTH(dateField); 我有一个名为Record(Hibernate)的JPA@实体。这详细说明了系统中每天创建的所有发票。每月将有许多参赛作品。每个记录都有一个状态:已付款、过
SELECT MONTH(dateField), sum(value) FROM mydb.records where status ='paid' group by MONTH(dateField) order by MONTH(dateField);
我有一个名为Record(Hibernate)的JPA@实体。这详细说明了系统中每天创建的所有发票。每月将有许多参赛作品。每个记录都有一个状态:已付款、过期、价值,以及许多其他信息,如客户的姓名和地址等
上述报表基本上按月汇总了所有数据,并汇总了每月所有已付款发票的价值,给出了1月份所有已付款发票、2月份所有已付款发票的汇总,以此类推……结果如下:
datefield value
1 4500
2 5500
3 5669
使用JPA@NamedQuery进行此操作的唯一方法是选择表中状态为“pai”的所有记录,然后使用我的Java代码以一种相当缓慢和丑陋的方式进行排序、排序和添加!有没有一种聪明的方法可以通过@NamedQuery实现这一点
感谢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从任何其他表创建实体一样。您可以从视图中进行选择,但将无法保存和更新它,但是,因为您使用的聚合与您的情况不同。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从任何其他表创建实体一样。您可以从视图中进行选择,但无法保存和更新它,但是由于您使用的是聚合,因此无论如何都不像您那样。感谢您的快速回复,Kevin,看起来很棒,比我的Java循环简单得多!那么这个新的“视图”将自动映射到我创建的JPA
@
实体月收入{}?然后一个名为“查询”的@
在新@
实体月收入中选择“全部”将产生结果?@user1843591。您好,Kevin,我可以在视图中添加“动态”值或动态参数吗?e、 g.按u所述查看..xxx,其中status='paid'和vendorid='${}。。。。我把原来的问题简化了一点。原始解决方案将汇总所有供应商的所有发票。我允许供应商登录并查看他们的数据,但这些数据都存储在一个表中,因此我只想逐个供应商进行聚合…只需在HQL中添加供应商id作为参数,并将其作为where子句包含在内。感谢Kevin的快速回复,看起来很棒,比我的Java循环简单得多!那么这个新的“视图”将自动映射到我创建的JPA@
实体月收入{}?然后一个名为“查询”的@
在新@
实体月收入中选择“全部”将产生结果?@user1843591。您好,Kevin,我可以在视图中添加“动态”值或动态参数吗?e、 g.按u所述查看..xxx,其中status='paid'和vendorid='${}。。。。我把原来的问题简化了一点。原始解决方案将汇总所有供应商的所有发票。我允许供应商登录并查看他们的数据,但这些数据都存储在一个表中,因此我只想逐个供应商进行聚合…只需将供应商id作为参数添加到HQL中,并将其作为where子句包含。