CriteriaQuery 等效于 MySQL 中的条件总和查询?

时间:2021-03-12 06:55:24

标签: spring hibernate jpa hibernate-criteria

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

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

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

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


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 查询不同,即使它返回正确的值。

1 个答案:

答案 0 :(得分:0)

您发布的查询看起来是正确的。那就好办了。您无法使用 HQL 或 JPA Criteria API 重现完全相同的 SQL。事实上,SQL 查询的语法是特定于 MySQL 的,并且仅因为 MySQL 没有原生布尔支持才有效,而是将其建模为整数 1 和 0。对此建模的 SQL 标准方法是使用聚合函数是null 拒绝并使用 case when 表达式在您的条件不满足时产生 null。

true