【问题标题】:How to use CASE inside HAVING COUNT() in HQL?如何在 HQL 中的 HAVING COUNT() 中使用 CASE?
【发布时间】:2015-12-14 18:45:54
【问题描述】:

我在 PostgreSQL 客户端控制台中测试了以下 SQL 查询,效果很好:

SELECT document_url FROM signature_transaction WHERE app_id = 2 GROUP BY document_url HAVING COUNT(CASE WHEN response_delivered THEN 1 ELSE 0 END) = COUNT(id);

然后我尝试在 Java 代码中做同样的事情,使用这样的 NamedQuery:

SELECT t.documentUrl FROM SignatureTransaction t WHERE t.appId = :appId GROUP BY t.documentUrl HAVING COUNT(CASE WHEN t.responseDelivered THEN 1 ELSE 0 END) = COUNT(t.id)

但我在部署应用程序时收到以下错误:

ERROR [org.hibernate.internal.SessionFactoryImpl] (ServerService Thread Pool -- 86) HHH000177: 
Error in named query: SignatureTransaction.findUrlOfDeliveredDocuments: 
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: responseDelivered near line 1, column 133 
[SELECT t.documentUrl FROM org.app.model.SignatureTransaction t WHERE t.appId = :appId GROUP BY t.documentUrl HAVING COUNT(CASE WHEN responseDelivered THEN 1 ELSE 0 END) = COUNT(t.id)]

我尝试在 COUNT() 中使用所有这些名称,但没有一个有效:

  • responseDelivered
  • t.responseDelivered
  • response_delivered
  • org.app.model.SignatureTransaction.responseDelivered

编写此 HQL 的正确方法是什么?

【问题讨论】:

    标签: java hibernate case hql having


    【解决方案1】:

    尝试检查 SignatureTransaction 实体是否具有 responseDelivered 字段并且其名称设置正确。注意 HSQL 看不到命名表的列,只是命名实体中的字段,这很重要。

    【讨论】:

    • 字段声明是@Column(name = "response_delivered") private boolean responseDelivered;,但它在一个超类上,称为Transaction。
    • 我刚刚在 CASE 上尝试了org.app.model.Transaction.responseDelivered,但得到了同样的错误。
    猜你喜欢
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2012-05-20
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多