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

如何使用CriteriaBuilder实现带多条件的INNER JOIN查询

解决方案

你需要使用JPA 2.1新增的Join.on()方法,即可将自定义条件直接追加到JOIN的ON子句中,而非放到WHERE子句。

完整实现代码

var cb = entityManager.getCriteriaBuilder();
// 若你需要返回id而非实体对象,可将泛型改为Long,后续select改为cq.select(entity.get(MyEntity_.id))
var cq = cb.createQuery(MyEntity.class);

var entity = cq.from(MyEntity.class);
// 获取Join对象,显式指定内连接(默认也为INNER,可省略)
Join<MyEntity, MyAttribute> attrJoin = entity.join(MyEntity_.attributes, JoinType.INNER);
// 核心逻辑:将key的匹配条件写入JOIN的ON子句
attrJoin.on(cb.equal(attrJoin.get(MyAttribute_.key), "special-key"));

cq.select(entity);
return entityManager.createQuery(cq).getResultList();

注意事项

  • 上述代码生成的SQL会完全符合你的预期,额外的a.key = "special-key"条件会直接拼接在ON子句后,而非出现在WHERE中。
  • 内连接场景下ON加条件和WHERE加条件的执行结果一致,但如果是左/右外连接场景,两种写法的查询结果会有明显差异,请根据实际需求选择。
  • 你当前MyEntity类中@OneToMany的@JoinColumn配置有误:你写的name = "my_attribute_id"指的是my_attribute表中用来关联my_entity的外键字段名,按照你给出的SQL,该字段应为event_id,请修正为@JoinColumn(name = "event_id"),否则生成的JOIN关联条件会不符合预期。

内容的提问来源于stack exchange,提问作者Dan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:06:01