Spring数据jpa @Query注释的工作原理

时间:2018-05-12 08:00:22

标签: spring spring-boot spring-data spring-data-jpa jpql

我是Spring dataJPA的新手。我很好奇查询注释是如何工作的。就像在我的场景中一样,我需要组织的所有userIds。所以这就是我所做的:

 @Query("select o.userId from User o where o.orgId = :orgId")   
 List <Integer> findUserIdsByOrgId(@Param("orgId")int orgId);

以上陈述合理。我得到一个用户ID列表。问题是当我更改查询以搜索User

 @Query("select o from User o where o.orgId = :orgId")  
 List <Integer> findUserIdsByOrgId(@Param("orgId")int orgId);

当我从userId移除o.userId时,将返回整个对象,而不是Integer

我的假设是,如果返回类型与查询中的返回类型不匹配,则应抛出错误。

1 个答案:

答案 0 :(得分:1)

事情是generics in Java are removed in runtime

  

如果类型参数是无界的,则将泛型类型中的所有类型参数替换为其边界或对象。因此,生成的字节码只包含普通的类,接口和方法。

因此Spring无法检查泛型类型,并相信您不匹配类型。当然,如果你返回Integer而不是User(没有泛型)那么Spring会抛出一个错误。