Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Data JPA: Specification with "like" and Long

I have the following problem. I used spring-data and i want to create a "like" statement for a Long Property.

I have tried the following, but without success.

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;
        }
    };

}

and domain class

public class Kunde implements Serializable
{

@ColumnYB(lable = "KundenNr.", order = 1)
@Id
@javax.persistence.Column(nullable = false, name = "kundennr")
protected Long kundenNr;

@ColumnYB(lable = "Deaktiviert")
@Column(nullable = false)
private boolean deaktiviert = false;

@Column(name = "kundenart")
private String kundenart;
...

I get the following error.

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]

What am I doing wrong?

like image 750
user1167253 Avatar asked Sep 10 '25 04:09

user1167253


2 Answers

That's because kundenNrin your entity class is a Long, and %4% doesn't parse as long.

In SQL, the % sign in the query is only appliable to varchar (and some variants), so it's not possible to use it on a long field, which probably is translated to a numeric field in the database.

like image 146
renke Avatar answered Sep 12 '25 19:09

renke


Used following specification to find records whose column (NUMBER) matches some digits:

    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)));
}

Oracle database was used.

like image 39
Andriy Avatar answered Sep 12 '25 18:09

Andriy