Java 弹簧数据JPA:带“的规格;例如;长

Java 弹簧数据JPA:带“的规格;例如;长,java,spring,hibernate,jpa,spring-data,Java,Spring,Hibernate,Jpa,Spring Data,我有以下问题。 我使用了spring数据,我想为一个长属性创建一个“like”语句 我试过以下方法,但没有成功 private Specification<T> createSpecification() { return new Specification<T>() { @Override public Predicate toPredicate(final Root<T> root, final Crite

我有以下问题。 我使用了spring数据,我想为一个长属性创建一个“like”语句

我试过以下方法,但没有成功

private Specification<T> createSpecification()
{
    return new Specification<T>()
    {

        @Override
        public Predicate toPredicate(final Root<T> root, final CriteriaQuery<?> query, final CriteriaBuilder cb)
        {

            final Predicate like = query.where(cb.like(root.<String> get("kundenNr"), "%4%")).getRestriction();

            return like;
        }
    };

}
我得到以下错误

org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [%4%] did not match expected type [java.lang.Long]; nested exception is java.lang.IllegalArgumentException: Parameter value [%4%] did not match expected type [java.lang.Long]
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:384) ~[spring-orm-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:157) ~[spring-orm-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417) ~[spring-orm-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59) ~[spring-tx-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213) ~[spring-tx-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147) ~[spring-tx-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:92) ~[spring-data-jpa-1.4.1.RELEASE.jar:na]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.0.1.RELEASE.jar:4.0.1.RELEASE]

我做错了什么?

那是因为您的实体类中的
kundenNr
是一个
长的
,而
%4%
解析的时间不长


在SQL中,查询中的%符号仅适用于varchar(以及某些变体),因此无法在长字段上使用它,而长字段可能已转换为数据库中的数字字段。

使用以下规范查找列(数字)与某些数字匹配的记录:

    public static org.springframework.data.jpa.domain.Specification<Model> numberLikeValue(Long value) {
    return (root, query, builder) ->
            org.springframework.util.ObjectUtils.isEmpty(value)
                    ? builder.conjunction()
                    : builder.like(builder.function("TO_CHAR", String.class, root.get("dbColumn")), contains(String.valueOf(value)));
}
public static org.springframework.data.jpa.domain.Specification numberLikeValue(长值){
返回(根、查询、生成器)->
org.springframework.util.ObjectUtils.isEmpty(值)
?生成器连接()
:builder.like(builder.function(“TO_CHAR”、String.class、root.get(“dbColumn”)),包含(String.valueOf(value));
}

使用了Oracle数据库。

还有其他可能性吗?您可以将您的值转换为字符串。详情如下:
    public static org.springframework.data.jpa.domain.Specification<Model> numberLikeValue(Long value) {
    return (root, query, builder) ->
            org.springframework.util.ObjectUtils.isEmpty(value)
                    ? builder.conjunction()
                    : builder.like(builder.function("TO_CHAR", String.class, root.get("dbColumn")), contains(String.valueOf(value)));
}