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

Java 从SQL查询生成案例表达式-条件生成器,条件查询,java,spring-boot,jpa,case,hibernate-criteria,Java,Spring Boot,Jpa,Case,Hibernate Criteria,我有上面的SQL查询,它给出了属于儿童、成人、青少年的学生数量 我已尝试将上述查询转换为JPA case表达式,但它并没有像上述查询那样为我提供预期的结果 查询给我的是case和count,而JPA代码给我的是不一样的 Query Result:- AgeGroup | Count child | 2 adult | 5 teenage | 4 final Expression=criteriaBuilder.selectCase() .when(criteriaBuilder.

我有上面的SQL查询,它给出了属于儿童、成人、青少年的学生数量

我已尝试将上述查询转换为JPA case表达式,但它并没有像上述查询那样为我提供预期的结果

查询给我的是case和count,而JPA代码给我的是不一样的

Query Result:-
AgeGroup | Count
child    | 2
adult    | 5
teenage  | 4
final Expression=criteriaBuilder.selectCase()
.when(criteriaBuilder.lessThanOrEqualTo(root.get(“dateOfServiceFrom”),
daysBeforeNow(lowDays)),“儿童”)
.when(criteriaBuilder.greaterThanOrEqualTo(root.get(“dateOfServiceFrom”),
daysBeforeNow(highDays)),“成人”)
。否则(“青少年”);
最终CriteriaQuery selectCase=CriteriaQuery.multiselect(criteriaBuilder.count(根))
.groupBy(表达式);
我努力了,但没有找到任何运气。 请使用JPA帮助实现上述结果


任何帮助都将不胜感激。。。。。。谢谢

我得到了上述查询的解决方案,并发布了链接供参考:-

final Expression=criteriaBuilder.selectCase()
.when(criteriaBuilder.lessThanOrEqualTo(root.get(“dateOfServiceFrom”),
daysBeforeNow(lowDays)),“儿童”)
.when(criteriaBuilder.greaterThanOrEqualTo(root.get(“dateOfServiceFrom”),
daysBeforeNow(highDays)),“成人”)
。否则(“青少年”);
final CriteriaQuery selectCase=CriteriaQuery.multiselect(表达式,criteriaBuilder.count(根))
.groupBy(criteriaBuilder.literal(1));
如果我们在select查询中使用任何表达式,并且必须使用相同的表达式进行分组,那么我们必须从select语句中指定表达式的位置,并将其传递给criteriaBuilder.literal({position})


对于上面的例子,表达式的位置是“1”,所以我在criteriaBuilder.literal(1)中通过了“1”。

你能编辑这篇文章来详细说明“JPA代码没有给我同样的信息吗?”?是否生成的sql不相同、结果不相同或抛出任何错误?只是出于好奇-您确定agegroup成人的case语句具有正确的日期('2020-02-03')?根据给定的select语句,我想知道从技术上讲,这是否会给青少年计数。是的,它的正确@kavithakarunakaran结果只是给出计数,而不是它所属@samabcde类别的标签,如果计数为0,则什么也不给出
Query Result:-
AgeGroup | Count
child    | 2
adult    | 5
teenage  | 4
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);

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));