【问题标题】:CriteriaQuery equivalent for conditional sum query in MySQL?CriteriaQuery 等效于 MySQL 中的条件和查询?
【发布时间】:2021-03-12 06:55:24
【问题描述】:

在 MySQL 中,我可以使用以下条件求和查询来计算行数,按特定条件分组:

SELECT SUM(synced=true) AS sum_a, SUM(synced=false) AS sum_b from test_table where name = "xyz";

我正在尝试将其翻译成等效的CriteriaQuery,但是我无法这样做。 CriteriaQuery 等效项如何查找此内容?

到目前为止,我所达到的最接近的是使用带有selectCase 表达式的multiselect 函数,如下所示:


criteriaQuery.multiselect(
        criteriaBuilder.sum(
                criteriaBuilder.<Number>selectCase().when(/* conditions for sum_a */), 1
                ).otherwise(0)
        ).alias("sum_a"),

        criteriaBuilder.sum(
                criteriaBuilder.<Number>selectCase().when(/* conditions for sum_b */), 1
                ).otherwise(0)
        ).alias("sum_b"),

然而,上述方法与开头提到的 SQL 查询不同,即使它返回正确的值。

【问题讨论】:

    标签: spring hibernate jpa hibernate-criteria


    【解决方案1】:

    您发布的查询看起来正确。这是最好的。您无法使用 HQL 或 JPA Criteria API 重现完全相同的 SQL。事实上,SQL 查询的语法是 MySQL 特有的,并且只因为 MySQL 没有原生布尔支持而起作用,而是将其建模为整数 1 和 0。建模它的 SQL 标准方法是使用聚合函数是如果条件不满足,则拒绝 null 并使用 case when 表达式产生 null。

    criteriaQuery.multiselect(
            criteriaBuilder.sum(
                    criteriaBuilder.<Integer>selectCase().when(/* conditions for sum_a */), 1
                    ).otherwise(criteriaBuilder.nullLiteral(Integer.class))
            ).alias("sum_a"),
    
            criteriaBuilder.sum(
                    criteriaBuilder.<Integer>selectCase().when(/* conditions for sum_b */), 1
                    ).otherwise(criteriaBuilder.nullLiteral(Integer.class))
            ).alias("sum_b"),
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-16
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      相关资源
      最近更新 更多