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
相关产品推荐
相关产品推荐

