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

Spring Data JPA查询报错:无法解析符号payment问题排查

问题原因及解决方案

你遇到的编译错误和潜在问题主要集中在HQL查询的几个细节上,我帮你逐一梳理并修正:

1. 实体类名称大小写错误

JPA的HQL查询是基于实体类而非数据库表名的,你写的from payment p里的payment是数据库表名(小写),但你的实体类是Payment(首字母大写),HQL要求严格匹配实体类的名称,所以这里必须改成from Payment p,这是导致"cannot resolve symbol: payment"编译错误的直接原因。

2. 字符串截取的参数精度问题

你的PAYMENT_REF固定19位,前6位是DBC+年份(比如DBC2020),剩余12位是序列号。原查询里的SUBSTRING(p.paymentRef,7,19)会从第7位开始截取19个字符,但实际上你只需要截取12位序列号,所以应该写成SUBSTRING(p.paymentRef, 7, 12),避免截取到无效的空字符或者超出范围的内容。

3. 返回类型不匹配

12位的序列号远超过int类型的最大值(2147483647,仅10位),用int接收会导致数值溢出错误,建议将返回类型改为Long或者BigInteger。

修正后的Repository代码

public interface PaymentRepository extends JpaRepository<Payment, String> { 
    @Query("select MAX(SUBSTRING(p.paymentRef, 7, 12)) from Payment p where p.paymentRef is not null") 
    Long getMaxRefNumber(); 
}

备选方案:使用原生SQL查询

如果你更习惯用Oracle原生语法,也可以开启原生查询模式,直接复用你在Oracle工具里验证过的语句:

public interface PaymentRepository extends JpaRepository<Payment, String> { 
    @Query(value = "select MAX(SUBSTR(PAYMENT_REF,7,12)) from PAYMENT p where p.PAYMENT_REF is not null", nativeQuery = true)
    Long getMaxRefNumber(); 
}

内容的提问来源于stack exchange,提问作者user1999453

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:18:24