Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL到JPA@NamedQuery的转换_Sql_Hibernate_Jpa_Relational Database_Java Ee 6 - Fatal编程技术网

SQL到JPA@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@实体。这详细说明了系统中每天创建的所有发票。每月将有许多参赛作品。每个记录都有一个状态:已付款、过

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

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子句包含。