You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:18:02