【问题标题】:JPA Query with GROUP BY, HAVING and COUNT使用 GROUP BY、HAVING 和 COUNT 进行 JPA 查询
【发布时间】:2016-10-11 13:04:51
【问题描述】:

所以下面的查询可能不是最有效的,仍然购买,我想知道为什么它没有返回任何结果,即使 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)

【问题讨论】:

    标签: jpa jpql


    【解决方案1】:

    这两个查询不一样。要使用实际查询,请使用 NativeQuery createNativeQuery() 而不是 Query。

    在您的情况下,JPA 版本似乎存在语法错误。

    1. 在 AND 之后缺少 IN 运算符。
    2. 在嵌套查询中,您选择 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);
    

    【讨论】:

    • 我尝试使用您提供的 JPA 查询,但没有成功,仍然没有结果。但是我设法使用您建议的 createNativeQuery() 做我想做的事。感谢您的回答,非常感谢!
    猜你喜欢
    • 2017-02-24
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2021-12-19
    相关资源
    最近更新 更多