升级到Spring5后JPA无法找到[ANumber]属性报错如何解决?
问题现象
项目升级到Spring 5版本后,原有可正常运行的代码出现如下报错:
Unable to locate Attribute with the the given name [ANumber] on this ManagedType [com.company.domain.Statistics]
根因说明
问题出在JPA的属性映射逻辑:旧版Spring Data JPA可以自动将查询方法中的ANumber映射到实体类的aNumber属性,但Spring 5对应的Spring Data JPA 2.0+版本调整了属性名解析规则,会直接将ANumber作为属性名查找,无法匹配到驼峰命名的aNumber属性,进而抛出异常。
相关代码
1. 领域实体类
@Data @Entity public class Statistics { @Id private Long id; private String aNumber; private Integer dispositionCode; @CreatedDate private OffsetDateTime created; }
2. Repository接口查询方法
Optional<Statistics> findFirstByIdAndANumberAndDispositionCodeInOrderByCreatedDesc(Long id, String aNumber, Integer... dispositionCode);
可用解决方案
方案1:使用
@Query显式声明JPQL(兼容性最高,推荐)
绕过Spring Data JPA的方法名自动解析规则,手动指定查询逻辑,不会受版本规则变更影响:@Query("SELECT s FROM Statistics s WHERE s.id = :id AND s.aNumber = :aNumber AND s.dispositionCode IN :dispositionCodes ORDER BY s.created DESC") Optional<Statistics> findFirstByIdAndANumberAndDispositionCodeInOrderByCreatedDesc( @Param("id") Long id, @Param("aNumber") String aNumber, @Param("dispositionCodes") Integer... dispositionCode );方案2:调整查询方法命名适配新解析规则
Spring 5对应版本的Spring Data JPA修改了属性名解析规则,对于首字母小写、第二个字母大写的属性(如aNumber),方法命名时不需要把首字母转为大写,直接保留原属性名的写法即可正常匹配:// 仅将原方法名中的AndANumber修改为AndaNumber即可 Optional<Statistics> findFirstByIdAndaNumberAndDispositionCodeInOrderByCreatedDesc(Long id, String aNumber, Integer... dispositionCode);
内容的提问来源于stack exchange,提问作者Shivang Agarwal
相关产品推荐
相关产品推荐

