Spring JPA 关联表查询返回实体及关联记录数出现类型不匹配问题
问题根源
- 关联映射配置错误触发类型不匹配
你当前的@ManyToOne注解默认关联Component的主键componenttabid(int类型),而你实际用来关联的外键是component_version表的componentid(varchar类型),JPA自动生成SQL时会直接对int和varchar类型做等值判断,就会触发你遇到的类型不匹配报错。 - JPQL语法不规范 + 查询位置错误
你之前的JPQL按z.componentid分组,但SELECT子句返回了完整的Component实体,部分数据库不支持非聚合字段不在分组条件中的语法;另外你第二个测试查询定义在了ComponentVersionRepository中,查询逻辑和Repository管理的实体不匹配,直接触发查询校验失败。
修复步骤
步骤1:修正关联映射配置
修改ComponentVersion类中的@ManyToOne注解,显式指定关联的目标字段为Component的componentid,而非默认主键:
@ManyToOne(targetEntity = Component.class, fetch = FetchType.LAZY) // 新增referencedColumnName指定关联目标表的字段 @JoinColumn(name = "componentid", referencedColumnName = "componentid", insertable = false, updatable = false) private Component component;
步骤2:修正JPQL查询
将查询放在ComponentRepository中,调整分组逻辑即可,需要保留无版本的组件可以用LEFT JOIN:
public interface ComponentRepository extends JpaRepository<Component, Integer> { @Query("SELECT new com.tool.modifiedcomponenttool.payload.response.ComponentAndVersionCountResponse(x, COUNT(z.componentid)) " + "FROM Component x LEFT JOIN x.componentversions z " + "GROUP BY x.componenttabid") List<ComponentAndVersionCountResponse> findComponentAndVersionCount(); }
如果不需要查询没有版本的组件,把
LEFT JOIN改成JOIN即可;部分对分组语法校验严格的数据库可以把GROUP BY子句扩展为GROUP BY x.componenttabid, x.componentid, x.componentname。
可选:如果要把查询放在ComponentVersionRepository中
可以调整为从版本侧聚合,这种方式无法查询到没有版本的组件:
public interface ComponentVersionRepository extends JpaRepository<ComponentVersion, Integer> { @Query("SELECT new com.tool.modifiedcomponenttool.payload.response.ComponentAndVersionCountResponse(z.component, COUNT(z.componentid)) " + "FROM ComponentVersion z " + "GROUP BY z.component") List<ComponentAndVersionCountResponse> findComponentAndVersionCount(); }
内容的提问来源于stack exchange,提问作者tackjaylor
相关产品推荐
相关产品推荐

