使用 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 方式。
另见
我想使用这个 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 方式。
另见