【问题标题】:SQL to JPA @NamedQuery ConversionSQL 到 JPA @NamedQuery 的转换
【发布时间】:2013-10-09 22:35:26
【问题描述】:

我正在寻找一种将这条 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 月支付的所有发票等等.....The结果看起来像:

datefield    value
1            4500
2            5500
3            5669

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

谢谢

【问题讨论】:

    标签: sql hibernate jpa relational-database java-ee-6


    【解决方案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 从任何其他表一样创建此实体。您可以从视图中进行选择,但无法保存和更新它,但是由于您使用聚合的方式与您不同。

    【讨论】:

    • 感谢 Kevin 的快速回复,看起来很棒,而且比我的 Java 循环简单得多!所以这个新的“视图”会自动映射到我创建的 JPA @Entity MONTHLY_REVENUE{}?然后在新的@Entity MONTHLY_REVENUE 中选择所有@NamedQuery 会产生结果吗?
    • @user1843591 没错。
    • 嗨 Kevin,我可以在视图中添加“动态”值或动态参数吗?例如按照您的描述查看..xxx where status ='paid' and where vendorid = ${} .... 我把我原来的问题简化得太多了。原始解决方案将汇总所有供应商的所有发票。我允许供应商登录并查看他们的数据,但它们都存储在一个表中,所以我只想逐个供应商汇总......
    • 只需将供应商 ID 作为参数添加到 HQL 中,并将其包含在 where 子句中即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多