criteriaquery等价于mysql中的条件和查询?

hgc7kmma  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(298)

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

i7uq4tfw

i7uq4tfw1#

你发布的查询看起来是正确的。这是最好的。不能用hql或jpa标准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"),

相关问题