【问题标题】:"CASE WHEN" clause inside SUMSUM 中的“CASE WHEN”子句
【发布时间】:2014-08-14 20:34:11
【问题描述】:

我的表/实体如下所示:

*ID* | *Description* | *Error* | *batchId*
  1  | test 111      |    0    | 456
  2  | test 222      |    1    | 456
  3  | test 333      |    0    | 456
  4  | test xxx      |    1    | 458
  5  | test yyy      |    1    | 458

我正在尝试以这种形式选择结果:

batchId | HowManyOK | HowManyErrors 
   456  |     2     |       1
   458  |     0     |       2

在 JPQL 中,我尝试过:

SELECT 
   g, 
   SUM( CASE WHEN g.error = false THEN 1 ELSE 0 END ) AS ok, 
   SUM( CASE WHEN g.error = false THEN 1 ELSE 0 END ) AS ko  
FROM
   GoogleMerchantLog g 
GROUP BY g.batchId

但它不能编译!它声称错误“封装的表达式不是有效的表达式。”在总和。

也许有一些建议可以使用 Criteria API 解决它?

没有解决办法? 我终于解决了映射本机查询:((

【问题讨论】:

  • 如何尝试只使用CASE WHEN... 而不使用SUM() 方法并确保使用JPA 2.x 版本。
  • 但是...通过删除 SUM(),我不会得到组的总和,我只会得到 1 或 0?
  • @FabioB。你解决了吗
  • 不幸的是......不!我想,我走了另一条路。记不太清了,抱歉。

标签: jpa jpql criteria-api case-when


【解决方案1】:

这是我刚刚写的代码:

@Query("SELECT new be.mteam.zoomit.persistence.vo.ZoomitValidation(Z.organization, " +
            "Z.documentType, " +
            "Z.language, " +
            "Z.recipientProfil, " +
            "Z.documentDate, " +
            "sum(case when(Z.status = be.mteam.zoomit.persistence.vo.ZoomitStatus.WAITVALIDATION) then 1 else 0 end), " +
            "sum(case when(Z.status = be.mteam.zoomit.persistence.vo.ZoomitStatus.WAITTOSEND " +
            "or Z.status = be.mteam.zoomit.persistence.vo.ZoomitStatus.POSTED " +
            "or Z.status = be.mteam.zoomit.persistence.vo.ZoomitStatus.CREATED " +
            "or Z.status = be.mteam.zoomit.persistence.vo.ZoomitStatus.SENDING) then 1 else 0 end), " +
            "sum(case when(Z.status = be.mteam.zoomit.persistence.vo.ZoomitStatus.SENT) then 1 else 0 end)) " +
        "from Zoomit as  Z " +
        "where Z.organization = :organization " +
            "and Z.status in (be.mteam.zoomit.persistence.vo.ZoomitStatus.WAITVALIDATION," +
            "be.mteam.zoomit.persistence.vo.ZoomitStatus.WAITTOSEND," +
            "be.mteam.zoomit.persistence.vo.ZoomitStatus.POSTED," +
            "be.mteam.zoomit.persistence.vo.ZoomitStatus.CREATED," +
            "be.mteam.zoomit.persistence.vo.ZoomitStatus.SENDING," +
            "be.mteam.zoomit.persistence.vo.ZoomitStatus.SENT) " +
        "group by Z.organization, Z.documentType, Z.language, Z.recipientProfil, Z.documentDate")
List<ZoomitValidation> getValidations(@Param("organization") String organization);

已成功执行。

您的代码:

发件人:

SELECT 
   g, 
   SUM( CASE WHEN g.error = false THEN 1 ELSE 0 END ) AS ok, 
   SUM( CASE WHEN g.error = false THEN 1 ELSE 0 END ) AS ko  
FROM
   GoogleMerchantLog g 
GROUP BY g.batchId

收件人:

SELECT 
   g.batchId, 
   SUM(CASE WHEN (g.error = false) THEN 1 ELSE 0 END) AS ok, 
   SUM(CASE WHEN (g.error = true) THEN 1 ELSE 0 END) AS ko  
FROM
   GoogleMerchantLog g 
GROUP BY g.batchId

马文:

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.2.5.RELEASE</version>

PS : 没有找到使用静态导入来缩短 ZoomitStatus 枚举的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2017-04-10
    相关资源
    最近更新 更多