Java 从SQL查询生成案例表达式-条件生成器,条件查询
我有上面的SQL查询,它给出了属于儿童、成人、青少年的学生数量 我已尝试将上述查询转换为JPA case表达式,但它并没有像上述查询那样为我提供预期的结果 查询给我的是case和count,而JPA代码给我的是不一样的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.
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));