如何使用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
相关产品推荐
相关产品推荐

