从 SQL 查询生成案例表达式 - 条件生成器、条件查询

Generate Case Expression from SQL Query - Criteria Builder, Criteria Query

select 
    (case 
        when dob <= '2020-02-03' then 'child'
        when dob >= '2020-02-03' then 'adult' 
        else 'teenage' 
    end) as AgeGroup, 
    count(*)
    FROM student
    GROUP BY AgeGroup
Query Result:-
AgeGroup | Count
child    | 2
adult    | 5
teenage  | 4

我有上面的 SQL 查询,它告诉我属于儿童、成人、青少年的学生人数。

我已经尝试将上述查询转换为 JPA 案例表达式,但它没有给我上述查询给出的预期结果。

查询为我提供了计数和大小写,而 JPA 代码没有为我提供相同的计数。

final Expression<Object> expression =  criteriaBuilder.selectCase()
        .when(criteriaBuilder.lessThanOrEqualTo(root.get("dateOfServiceFrom"),
                daysBeforeNow(lowDays)), "child")
        .when(criteriaBuilder.greaterThanOrEqualTo(root.get("dateOfServiceFrom"),
                daysBeforeNow(highDays)), "adult")
        .otherwise("teenage");
final CriteriaQuery<Object[]> selectCase = criteriaQuery.multiselect(criteriaBuilder.count(root))
        .groupBy(expression);

我努力尝试,但没有找到任何运气。 请帮助使用 JPA 实现上述结果。

任何帮助将不胜感激……谢谢

我得到了上述查询的解决方案并发布了 link 以供参考:- https://www.nuomiphp.com/eplan/en/5760.html

final Expression<Object> expression =  criteriaBuilder.selectCase()
        .when(criteriaBuilder.lessThanOrEqualTo(root.get("dateOfServiceFrom"),
                daysBeforeNow(lowDays)), "child")
        .when(criteriaBuilder.greaterThanOrEqualTo(root.get("dateOfServiceFrom"),
                daysBeforeNow(highDays)), "adult")
        .otherwise("teenage");
final CriteriaQuery<Object[]> selectCase = criteriaQuery.multiselect(expression, criteriaBuilder.count(root))
        .groupBy(criteriaBuilder.literal(1));

如果我们在 select 查询中使用任何表达式,并且我们必须使用相同的表达式进行分组,那么我们必须从 select 语句中指定表达式的位置并将其传递到 criteriaBuilder.literal({position}).

对于上面的例子,表达式的位置是'1'所以我在criteriaBuilder.literal(1)中传递了'1'。