You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:15:03