Spring Data JPA查询是否会意外返回Object而非指定实体类实例?
该Spring Data JPA查询在1.5.x版本中返回Object实例的场景
在你提供的代码场景下,使用Spring Boot Data JPA 1.5.x版本时,当JPQL查询包含显式JOIN但未明确指定SELECT子句,就会出现返回Object(实际是Object[]数组)而非预期BlaEntity实例的情况。
原因分析
你的JPQL语句:
FROM bla b JOIN b.dependency d WHERE d.something = ?1 AND b.somethingElse = ?2
缺少显式的SELECT子句。根据JPA规范,这种写法会默认返回查询中涉及的所有实体的组合——也就是BlaEntity实例和它关联的dependency实体实例,两者会被打包成一个Object[]返回。
而Spring Data JPA 1.5.x的类型转换逻辑存在缺陷,无法自动识别并提取根实体BlaEntity,导致原本声明返回Optional<BlaEntity>的方法,实际返回的是包含两个实体的Object[],对外表现为返回了Object实例。
修复方案
修改JPQL语句,显式指定要查询的根实体:
SELECT b FROM bla b JOIN b.dependency d WHERE d.something = ?1 AND b.somethingElse = ?2
通过SELECT b明确告知JPA仅返回BlaEntity实例,Spring Data JPA就能正确将结果映射到你声明的返回类型。
内容的提问来源于stack exchange,提问作者ngc4579
相关产品推荐
相关产品推荐

