使用 COUNT 和 SUM 实现 JPA 查询

Implement JPA query with COUNT and SUM

我想使用这个 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 中的正确方法是什么?

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 实体上运行。请注意,您说的是 class 名称,而不是 table。对象没有表示 class 中任何字段的通配符。相反,您指定对象本身不为 null 以表示那里有一行。

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

另见