JPA中如何根据selectCase获取记录数
How to get the count of records based on selectCase in JPA
我要统计满足条件的记录条数
示例:-
table 和 table 中有 400 条记录,由 employee_name 和 employee_salary 组成,我想找出薪水低于 20K 的员工人数以及薪水超过 20K 的员工人数。我尝试了一些我们可以使用 criteriaBuilder.selectCase() 实现的事情,但我无法找到确切的解决方案。
感谢帮助
在 JPA 存储库中使用本机查询可能更方便:
@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Integer> {
@Query(nativeQuery = true,
value = "SELECT (CASE WHEN e.salary < :minLimit THEN 'Low' ELSE 'High' END) isLow, COUNT(*) "
+ "FROM employee e GROUP BY isLow")
List<Object[]> calcStats(@Param("minLimit") Integer minLimit);
}
然后可以通过自动装配存储库调用此方法:
employeeRepository.calcStats(20_000)
.forEach(e -> System.out.printf("%s - %d%n", e[0], e[1]));
更新
如果需要始终 return 0,则需要更新查询:
SELECT salary_types.salary_type, COALESCE(sum(stats.cc), 0) cc
FROM (
SELECT CASE WHEN salary < :minLimit THEN 'low' ELSE 'high' END isLow, COUNT(*) cc
FROM employee e
GROUP BY isLow) stats
RIGHT OUTER JOIN (
SELECT salary_type
FROM (VALUES ('high'), ('low'))
salary_types(salary_type_type)
) salary_types ON stats.isLow = salary_types.salary_type
GROUP BY salary_types.salary_type;
对于 PostgreSQL,可以加入这个较短的变体
RIGHT JOIN (SELECT UNNEST(ARRAY['high', 'low']) salary_type) salary_types
我要统计满足条件的记录条数
示例:-
table 和 table 中有 400 条记录,由 employee_name 和 employee_salary 组成,我想找出薪水低于 20K 的员工人数以及薪水超过 20K 的员工人数。我尝试了一些我们可以使用 criteriaBuilder.selectCase() 实现的事情,但我无法找到确切的解决方案。
感谢帮助
在 JPA 存储库中使用本机查询可能更方便:
@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Integer> {
@Query(nativeQuery = true,
value = "SELECT (CASE WHEN e.salary < :minLimit THEN 'Low' ELSE 'High' END) isLow, COUNT(*) "
+ "FROM employee e GROUP BY isLow")
List<Object[]> calcStats(@Param("minLimit") Integer minLimit);
}
然后可以通过自动装配存储库调用此方法:
employeeRepository.calcStats(20_000)
.forEach(e -> System.out.printf("%s - %d%n", e[0], e[1]));
更新
如果需要始终 return 0,则需要更新查询:
SELECT salary_types.salary_type, COALESCE(sum(stats.cc), 0) cc
FROM (
SELECT CASE WHEN salary < :minLimit THEN 'low' ELSE 'high' END isLow, COUNT(*) cc
FROM employee e
GROUP BY isLow) stats
RIGHT OUTER JOIN (
SELECT salary_type
FROM (VALUES ('high'), ('low'))
salary_types(salary_type_type)
) salary_types ON stats.isLow = salary_types.salary_type
GROUP BY salary_types.salary_type;
对于 PostgreSQL,可以加入这个较短的变体
RIGHT JOIN (SELECT UNNEST(ARRAY['high', 'low']) salary_type) salary_types