0

Building hibernate query using CriteriaBuilder and Predicate as below. I am getting below error when executing this code =>

What am I doing wrong here ?

    public List<ProductOffer> getProductOffersByDateRange(Date startFromDate, Date startToDate, Date endFromDate, Date endToDate) {
        
        List<ProductOfferDAO> results = productOfferRepository.findAll(
                getSpecFromDatesAndExample(startFromDate, startToDate, endFromDate, endToDate, Example.of(new ProductOfferDAO())));
        
        return results.stream().map(productOfferTransformer::transform).collect(Collectors.toList());
    }


    private Specification<ProductOfferDAO> getSpecFromDatesAndExample(Date startFromDate,
                                                                  Date startToDate,
                                                                  Date endFromDate,
                                                                  Date endToDate,
                                                                  Example<ProductOfferDAO> example) {
    return (Specification<ProductOfferDAO>) (root, query, builder) -> {
        final List<Predicate> predicates = new ArrayList<>();

        predicates.add(builder.and(builder.isNotNull(root.get("startDate")),
                builder.greaterThan(root.get("startDate").as(Date.class), startFromDate)));
        predicates.add(builder.and(builder.isNotNull(root.get("startDate")),
                builder.lessThan(root.get("startDate").as(Date.class), startToDate)));
        predicates.add(builder.and(builder.isNotNull(root.get("endDate")),
                builder.greaterThan(root.get("endDate").as(Date.class), endFromDate)));
        predicates.add(builder.and(builder.isNotNull(root.get("endDate")),
                builder.lessThan(root.get("endDate").as(Date.class), endToDate)));

        predicates.add(QueryByExamplePredicateBuilder.getPredicate(root, builder, example));

        return builder.and(predicates.toArray(new Predicate[predicates.size()]));
    };
    }

Below is the error stacktrace ==>

{"timestamp":"2023-06-20T23:14:17.432Z","log_level":"ERROR","correlation_id":"rrt-098d5c0fd72b2251b-c-sy-18147-58271377-1","client_id":"135750084","request_context":{"method":"GET","path":"/productoffers","status-code":""},"response-time":"","trace_id":"1592056757147782155","dd":{"trace_id":"1592056757147782155","span_id":"8822821139017151941"},"message":"Error java.lang.NullPointerException: Cannot invoke "org.hibernate.query.sqm.tree.predicate.SqmPredicate.copy(org.hibernate.query.sqm.tree.SqmCopyContext)" because "predicate" is null \tat org.hibernate.query.sqm.tree.predicate.SqmJunctionPredicate.copy(SqmJunctionPredicate.java:54) \tat org.hibernate.query.sqm.tree.predicate.SqmJunctionPredicate.copy(SqmJunctionPredicate.java:21) \tat org.hibernate.query.sqm.tree.predicate.SqmWhereClause.copy(SqmWhereClause.java:33) \tat org.hibernate.query.sqm.tree.select.SqmQuerySpec.copy(SqmQuerySpec.java:104) \tat org.hibernate.query.sqm.tree.select.SqmQuerySpec.copy(SqmQuerySpec.java:53) \tat org.hibernate.query.sqm.tree.select.SqmSelectStatement.copy(SqmSelectStatement.java:122) \tat org.hibernate.query.sqm.tree.select.SqmSelectStatement.copy(SqmSelectStatement.java:42) \tat org.hibernate.query.sqm.internal.QuerySqmImpl.(QuerySqmImpl.java:228) \tat org.hibernate.internal.AbstractSharedSessionContract.createCriteriaQuery(AbstractSharedSessionContract.java:1337) \tat org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:1298) \tat org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:126) \tat jdk.internal.reflect.GeneratedMethodAccessor96.invoke(Unknown Source) \tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) \tat java.base/java.lang.reflect.Method.invoke(Method.java:568) \tat org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:360) \tat jdk.proxy3/jdk.proxy3.$Proxy201.createQuery(Unknown Source) \tat jdk.internal.reflect.GeneratedMethodAccessor96.invoke(Unknown Source) \tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) \tat java.base/java.lang.reflect.Method.invoke(Method.java:568) \tat org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311) \tat jdk.proxy3/jdk.proxy3.$Proxy201.createQuery(Unknown Source) \tat org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:748) \tat org.springframework.data.jpa.repository.support.SimpleJpaRepository.getQuery(SimpleJpaRepository.java:726) \tat org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.java:461) \tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) \tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) \tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) \tat java.base/java.lang.reflect.Method.invoke(Method.java:568) \tat org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:288) \tat org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:136) \tat org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:120) \tat org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) \tat org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) \tat org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) \tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) \tat org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) \tat org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) \tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) \tat org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:77) \tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) \tat org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) \tat org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:391) \tat org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) \tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) \tat org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) \tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) \tat org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:163) \tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) \tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) \tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) \tat datadog.trace.instrumentation.springdata.RepositoryInterceptor.invoke(RepositoryInterceptor.java:31) \tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) \tat org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) \tat jdk.proxy3/jdk.proxy3.$Proxy221.findAll(Unknown Source) \tat au.com.mydump.offer.service.ProductOfferService.getProductOffersByDateRange(ProductOfferService.java:101) \tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) \tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) \tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) \tat java.base/java.lang.reflect.Method.invoke(Method.java:568) \tat org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) \tat org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)

.....................................

alex
  • 147
  • 1
  • 4
  • 17
  • please post the full stack trace of exception – ali4j Jun 20 '23 at 07:55
  • @ali4j Posted the full stacktrace. – alex Jun 20 '23 at 23:51
  • Added debug logs and found that below code returning null. QueryByExamplePredicateBuilder.getPredicate(root, builder, example). But wondering why this will return null, as the 3 arguments root, builder and example have proper values printed in debug logs. – alex Jun 21 '23 at 04:55
  • Also, want to mention that we are on Springboot 3.1.0 which means hibernate version 6.2.2.Final – alex Jun 21 '23 at 04:58
  • "au.com.mydump.offer.service.ProductOfferService.getProductOffersByDateRange(ProductOfferService.java:101) " can you post the full source code of ProductOfferService class? – ali4j Jun 22 '23 at 14:44

0 Answers0