使用 GROUP BY、HAVING 和 COUNT 的 JPA 查询
JPA Query with GROUP BY, HAVING and COUNT
所以下面的查询可能不是最有效的,仍然购买,我想知道为什么它没有返回任何结果,即使 SQL 对应的查询有。没有错误,我只是没有得到结果。它可能不是我在 MySQL 中编写的查询的正确等价物?
这是 JPA JPQL。
Query query = em.createQuery("SELECT sub FROM Subscription sub WHERE "
+ "sub.isSuspended = 0 AND "
+ "(SELECT i FROM Invoice i WHERE i.dateDue < CURRENT_DATE AND i.datePaid IS NULL "
+ "GROUP BY i HAVING COUNT(i.idInvoice) > 2) MEMBER OF sub.invoices");
这是 MySQL 的 SQL。
SELECT * from subscription
WHERE subscription.is_suspended = 0 AND id_subscription IN
(SELECT id_subscription FROM invoice
WHERE date_due < CURDATE() AND date_paid IS NULL
GROUP BY id_subscription
HAVING COUNT(*) > 2)
这两个查询不一样。要使用实际查询,请使用 NativeQuery createNativeQuery()
而不是 Query.
在你的情况下,JPA 版本似乎有语法错误。
- 在 AND 之后您缺少 IN 运算符。
- 在嵌套查询中,您选择
i
而不是 i.idInvoice
JPA 查询应该如下所示
SELECT sub FROM Subscription sub
WHERE sub.isSuspended = 0
AND sub.idSubscription IN
(SELECT i.idInvoice
FROM Invoice i
WHERE i.dateDue < CURRENT_DATE AND i.datePaid IS NULL
GROUP BY i.idInvoice
HAVING COUNT(i.idInvoice) > 2);
所以下面的查询可能不是最有效的,仍然购买,我想知道为什么它没有返回任何结果,即使 SQL 对应的查询有。没有错误,我只是没有得到结果。它可能不是我在 MySQL 中编写的查询的正确等价物?
这是 JPA JPQL。
Query query = em.createQuery("SELECT sub FROM Subscription sub WHERE "
+ "sub.isSuspended = 0 AND "
+ "(SELECT i FROM Invoice i WHERE i.dateDue < CURRENT_DATE AND i.datePaid IS NULL "
+ "GROUP BY i HAVING COUNT(i.idInvoice) > 2) MEMBER OF sub.invoices");
这是 MySQL 的 SQL。
SELECT * from subscription
WHERE subscription.is_suspended = 0 AND id_subscription IN
(SELECT id_subscription FROM invoice
WHERE date_due < CURDATE() AND date_paid IS NULL
GROUP BY id_subscription
HAVING COUNT(*) > 2)
这两个查询不一样。要使用实际查询,请使用 NativeQuery createNativeQuery()
而不是 Query.
在你的情况下,JPA 版本似乎有语法错误。
- 在 AND 之后您缺少 IN 运算符。
- 在嵌套查询中,您选择
i
而不是i.idInvoice
JPA 查询应该如下所示
SELECT sub FROM Subscription sub
WHERE sub.isSuspended = 0
AND sub.idSubscription IN
(SELECT i.idInvoice
FROM Invoice i
WHERE i.dateDue < CURRENT_DATE AND i.datePaid IS NULL
GROUP BY i.idInvoice
HAVING COUNT(i.idInvoice) > 2);