Hibernate throws exception (Ordinal parameter not bound) when trying to search by embedded entity field

75 Views Asked by At

I have User Entity with embedded OrgUnit Entity in next format:

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "a_user")
public class User {
......
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "a_user", nullable = false, updatable = false)
    private Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    @JoinColumn(name = "a_org_unit")
    private OrgUnit orgUnit;
......
}
@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "org_unit")
public class OrgUnit {
    @Id
    @Column(name = "a_org_unit", nullable = false, updatable = false)
    private Long id;
  
    @Column(name = "a_org_unit_code", length = 30)
    private String code;

    @JsonProperty("userList")
    @OneToMany(mappedBy = "orgUnit", fetch = FetchType.LAZY)
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    private Set<User> userList;

In my interface implementation I have next method:

        @Override
    public List<User> getUserByOption(SearchOptions searchOption) {
        Option option = searchOption.getOption();
        String line = searchOption.getText();
        if(option==Option.ALL)
            return userRepository.findAll(
                    allFieldsLike(
                            line
                            ,reverseFullName(line)
                            ,orgUnitRepository.findOrgUnitByCodeIgnoreCase(line)
                    )
            );

Embedded functions look like this:

    private Specification<User> allFieldsLike(String line, String reversedLine, OrgUnit orgUnitIdByCode){
        return (root, query, cb) -> {
            query.distinct(true);
            Specification<User> userSpecification = where(fullNameLike(line,reversedLine))
                    .or(tabNumberLike(line))
                    .or(phoneNumberLike(line))
                    .or(orgUnitCodeLike(orgUnitIdByCode));
            return userSpecification.toPredicate(root,query,cb);
        };
    }



    private Specification<User> orgUnitCodeLike(OrgUnit orgUnitCode){
        return ((root, query, criteriaBuilder) ->
                criteriaBuilder.equal(root.get("orgUnit"),orgUnitCode));
    }

When I try to call my optional search I get exception with following trace:

Caused by: org.hibernate.QueryException: Ordinal parameter not bound : null
    at org.hibernate.query.internal.QueryParameterBindingsImpl.lambda$validate$0(QueryParameterBindingsImpl.java:139) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
    at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
    at org.hibernate.query.internal.ParameterMetadataImpl.visitParameters(ParameterMetadataImpl.java:193) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
    at org.hibernate.query.spi.ParameterMetadataImplementor.visitRegistrations(ParameterMetadataImplementor.java:29) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
    at org.hibernate.query.internal.QueryParameterBindingsImpl.validate(QueryParameterBindingsImpl.java:132) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
    at org.hibernate.query.spi.AbstractSelectionQuery.beforeQuery(AbstractSelectionQuery.java:382) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
    at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:360) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
    at org.hibernate.query.sqm.internal.QuerySqmImpl.list(QuerySqmImpl.java:1073) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
    at org.hibernate.query.Query.getResultList(Query.java:94) ~[hibernate-core-6.1.6.Final.jar:6.1.6.Final]
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:466) ~[spring-data-jpa-3.1.0.jar:3.1.0]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:288) ~[spring-data-commons-3.1.0.jar:3.1.0]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:136) ~[spring-data-commons-3.1.0.jar:3.1.0]
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:120) ~[spring-data-commons-3.1.0.jar:3.1.0]
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) ~[spring-data-commons-3.1.0.jar:3.1.0]
    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-3.1.0.jar:3.1.0]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) ~[spring-data-commons-3.1.0.jar:3.1.0]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.9.jar:6.0.9]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) ~[spring-data-commons-3.1.0.jar:3.1.0]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) ~[spring-data-commons-3.1.0.jar:3.1.0]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.9.jar:6.0.9]
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:77) ~[spring-data-commons-3.1.0.jar:3.1.0]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.9.jar:6.0.9]
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) ~[spring-tx-6.0.9.jar:6.0.9]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:391) ~[spring-tx-6.0.9.jar:6.0.9]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) ~[spring-tx-6.0.9.jar:6.0.9]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.9.jar:6.0.9]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-6.0.9.jar:6.0.9]
    ... 84 common frames omitted


I don't undestand how to bound OrgUnit entity into my query. I tried to use Long id values extracted from embedded entity, but I got issue with incompatible types.

0

There are 0 best solutions below