Spring Data类投影查询@OneToMany关联实体报Unknown column错误问题
解决方案
存在@OneToMany关联时完全可以使用类投影完成查询,你当前报错是两个配置问题共同导致的,修复方案如下:
问题根因
- 复合主键属性引用错误
Circuit类使用@EmbeddedId定义了复合主键key,id是主键对象的子属性,你在JPQL中直接写c.id会导致Hibernate找不到对应字段,生成错误的SQL查询列。 - 构造函数投影未显式关联@OneToMany集合
JPQL的构造函数表达式不会自动处理关联集合查询,直接写c.workflow会导致生成的SQL缺少正确的关联逻辑,触发字段不存在错误。
修复代码
修改CircuitRepository的查询语句,显式关联workflow集合,用Hibernate专属的collect函数聚合同主键对应的Step对象,同时修正主键属性引用路径:
@Transactional(readOnly = true) @Query("select new com.docapost.circuit.CircuitLight(c.key.id, collect(wf)) from Circuit c left join c.workflow wf where c.account.siren = :siren group by c.key.id") Set<CircuitLight> findAllByAccountSirenProjection(@Param("siren") String siren);
兼容替代方案
如果你使用的JPA实现不支持collect函数,可以用两步查询手动组装对象,兼容性更强:
// 第一步先查符合条件的Circuit主键ID列表 @Query("select c.key.id from Circuit c where c.account.siren = :siren") List<String> findCircuitIdsBySiren(@Param("siren") String siren); // 第二步批量查询对应ID关联的Step @Query("select s from Step s where s.circuit.key.id in :circuitIds") List<Step> findStepsByCircuitIds(@Param("circuitIds") List<String> circuitIds);
之后在业务逻辑层按Circuit ID分组Step,手动封装CircuitLight对象即可。
注意事项
- 确保CircuitLight的构造函数参数顺序、类型完全匹配,第一个为String类型id,第二个为Set
类型workflow - 你之前调整的Step类复合外键
@JoinColumns配置正确,无需修改
内容的提问来源于stack exchange,提问作者Zabuza
相关产品推荐
相关产品推荐

