【问题标题】:Implement JPA query with COUNT and SUM使用 COUNT 和 SUM 实现 JPA 查询
【发布时间】:2019-07-02 21:10:56
【问题描述】:

我想使用这个 SQL 查询来实现 JPA 查询:

String hql = "SELECT DATE(date) AS Date, SUM(volume) AS amount, COUNT(*) AS number_of_transactions " + 
                " FROM " + PaymentTransactionsDailyFacts.class.getName() + " WHERE (date BETWEEN :start_date AND :end_date )" + 
                " GROUP BY DATE(date)";

我试过这个:

String hql = "SELECT DATE(e.date) AS Date, SUM(e.volume) AS amount, COUNT(e.*) AS count " + 
                " FROM " + PaymentTransactionsDailyFacts.class.getName() + " e WHERE (date BETWEEN :start_date AND :end_date )" + 
                " GROUP BY DATE(date)";

但我得到错误:

expecting IDENT, found '*' near line 1, column 63 [SELECT DATE(e.date) AS Date, SUM(e.volume) AS amount, COUNT(e.*) AS count  FROM .......PaymentTransactionsDailyFacts e WHERE (date BETWEEN :start_date AND :end_date ) GROUP BY DATE(date)]

在 JPA 中实现这个查询的正确方法是什么?

【问题讨论】:

  • 你有答案吗?因为这个问题的答案还没有被接受,你也没有回应。我也需要这些信息
  • 见下图。

标签: java jpa jpa-2.0 jpa-2.1


【解决方案1】:

JPQL 不知道* 是什么意思。你只需要说e,而不是e.*

String hql = "SELECT DATE(e.date) AS Date, SUM(e.volume) AS amount, COUNT(e) AS count " 
              + " FROM " + PaymentTransactionsDailyFacts.class.getName()
              + " e WHERE (date BETWEEN :start_date AND :end_date )" 
              + " GROUP BY DATE(date)";

这是因为 JPQL 在 Java 实体上运行。请注意,您说的是类名,而不是表。对象没有通配符来表示类中的任何字段。相反,您指定对象本身不为 null 以表示存在一行。

SQL 中的e.* 语法本质上(尽管可能不是字面意思)表示该行上至少存在一个非空列。因为它没有任何更直接的方式来表示存在一行。但是 JPQL 确实有办法说对象存在。这是一个基本的 Java 非空检查。所以在 JPQL 中,您使用 Java 方式(尽管使用 JPQL 语法)而不是 SQL 方式。

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    相关资源
    最近更新 更多