Java Spring JPA CriteriaBuilder如何实现仅对列中非空值求和
实现逻辑说明
你写的原生SQL中SUM(t2.column2 IS NOT NULL)的本质是统计关联表t2中column2非空的记录数:数据库会自动将布尔表达式的结果转为1(符合条件)和0(不符合条件),求和结果就是符合条件的行数。用Spring JPA CriteriaBuilder实现时,需要先将非空判断转为数值表达式,再对表达式求和。
完整实现代码
// 1. 首先构造左连接,对应SQL的LEFT OUTER JOIN table t2 // 注意:关联属性名替换为你实体类中对应t2表的关联字段名 Join<YourEntity, YourEntity> t2Join = root.join("关联属性名", JoinType.LEFT); // 2. 构造非空判断的数值表达式:column2不为空返回1,否则返回0 Expression<Integer> notNullExpr = cb.selectCase() .when(cb.isNotNull(t2Join.get("column2")), 1) .otherwise(0); // 3. 构造查询字段,对应SELECT部分 criteriaQuery.multiselect( root.get("column1").alias("column1"), cb.sum(notNullExpr).alias("sumNotNullCount") ); // 4. 开启去重,对应SELECT DISTINCT criteriaQuery.distinct(true); // 5. 设置分组规则,对应GROUP BY column1, column2 criteriaQuery.groupBy(root.get("column1"), t2Join.get("column2"));
补充说明
- 如果你的业务逻辑不需要按
t2.column2分组,可以去掉groupBy中的t2Join.get("column2"),避免出现同column1返回多条记录的问题 - 代码中的
YourEntity替换为你实际对应的实体类名称即可
内容的提问来源于stack exchange,提问作者Matthew S.
相关产品推荐
相关产品推荐

