Spring数据查询子串

问题描述

我有一列名为 PAYMENT_REF 的列包含以下序列的值:

DBC2020999999999999

它的长度总是 19,以 DBC 开头,后面是年份,即这一部分:DBC2020

年份后面的数字是序列号,即999999999999

基本上我需要做一个查询,只从忽略静态 DBC 和年份 2020 的序列号中找到最大值。

基本上,当我在 oracle developer ide 上运行以下查询时,我得到了正确的结果:

select MAX(SUBSTR(PAYMENT_REF,7,19))
from PAYMENT p
where PAYMENT_REF is not null;

所以我尝试了以下查询,它看起来应该得到以下的最大值:

public interface PaymentRepository extends JpaRepository<Payment,String> {


    @Query(" select MAX(SUBSTRING(p.paymentRef,19)) from payment p where p.paymentRef is not null")
    int getMaxRefNumber();
}

但我收到一个编译错误无法解析符号:付款,请问我在这里遗漏了什么?

解决方法

我想您应该通过以下方式更正您的查询:

@Query("select MAX(SUBSTRING(p.paymentRef,8,12)) from Payment p where p.paymentRef is not null")
String getMaxRefNumber();

正如 documentation 中所述:

SUBSTRING

提取字符串值的一部分。第二个参数表示起始位置,其中 1 是字符串的第一个字符。第三个(可选)参数表示长度。

1      8
|      |
DBC2020999999999999
       \          /
         12 chars

附言老实说,我无法在 hql 中将字符串转换为数字。

语句如下:

select MAX( cast(SUBSTRING(p.paymentRef,12) as long) )
from Payment p where p.paymentRef is not null

不起作用,出现以下异常:

java.lang.IllegalArgumentException: Type specified for TypedQuery [java.lang.Long] is incompatible with query return type [class java.lang.String]
at org.hibernate.internal.AbstractSharedSessionContract.resultClassChecking(AbstractSharedSessionContract.java:863)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:817)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)