从 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'。
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'。