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