Java JPA createQuery,当列表为null或空时,将传递列表作为参数

Java JPA createQuery,当列表为null或空时,将传递列表作为参数,java,mysql,sql,jpa,Java,Mysql,Sql,Jpa,我正在尝试使用多个表中的联接和作为参数传递列表来创建查询。我在查询字符串中放入null和empty检查。但是,我在QueryNode.getDataType上得到了NullPointerException。下面是查询和异常 query = em.createQuery("select avg(kpi.duration), kpi.taskId from KPI kpi, User user, UserRole userRole, Shop shop where " +

我正在尝试使用多个表中的联接和作为参数传递列表来创建查询。我在查询字符串中放入null和empty检查。但是,我在QueryNode.getDataType上得到了NullPointerException。下面是查询和异常

    query = em.createQuery("select avg(kpi.duration), kpi.taskId from KPI kpi, User user, UserRole userRole, Shop shop where " +
            "(user.clientId = :customer or :customer is null) and (kpi.userId in :users or :users is null or :users = '' ) and " +
            "(userRole.role in :roles or :roles is null or :roles = '') and (shop.shopName in :shopNames or :shopNames is null or :shopNames = '') " +
            "and kpi.userId = userRole.userId and kpi.userId = user.id and kpi.userId = shop.userId group by kpi.taskId");

    query.setParameter("customer",customer);
    query.setParameter(“users”,users);
    query.setParameter(“roles”,roles);
    query.setParameter("shopNames", shopNames);

    if (query != null){
        List<Object[]> result = query.getResultList();
}
query=em.createQuery(“从kpi中选择平均值(kpi.duration)、kpi.taskId、用户用户用户、用户角色用户角色、店铺位置”+
“(user.clientId=:customer或:customer为null)和(kpi.userId in:users或:users为null或:users=”)和”+
(userRole.role-in:roles或:roles为null或:roles='')和(shop.shopName-in:shopNames或:shopNames为null或:shopNames='')+
“和kpi.userId=userRole.userId和kpi.userId=user.id和kpi.userId=shop.userId按kpi.taskId分组”);
query.setParameter(“客户”,客户);
query.setParameter(“用户”,用户);
query.setParameter(“角色”,角色);
query.setParameter(“shopNames”,shopNames);
if(查询!=null){
List result=query.getResultList();
}
用户、角色和店名是列表,客户是字符串。我已经创建了只使用带有空检查的字符串的查询,并且成功了。然而,在列表中,它出现了以下错误。任何不检查if-else逻辑中每个参数的建议

[请求处理失败;嵌套异常为 java.lang.NullPointerException]及其根本原因 位于的java.lang.NullPointerException org.hibernate.hql.internal.ast.tree.QueryNode.getDataType(QueryNode.java:164) 在 org.hibernate.hql.internal.ast.tree.AbstractNullnessCheckNode.extractDataType(AbstractNullnessCheckNode.java:118) 在 org.hibernate.hql.internal.ast.tree.AbstractNullnessCheckNode.initialize(AbstractNullnessCheckNode.java:52) 在 org.hibernate.hql.internal.ast.hqlslwalker.prepareLogioCoperator(hqlslwalker.java:1224) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonextpr(HqlSqlBaseWalker.java:4218) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1935) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1888) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1885) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1863) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1860) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1860) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1860) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1860) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1860) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.where子句(HqlSqlBaseWalker.java:794) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:595) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299) 在 org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.docomFile(QueryTranslatorImpl.java:183) 在 org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:105) 在 org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:80) 在 org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168) 在 org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:219) 位于org.hibernate.internal.SessionImpl.list(SessionImpl.java:1240) org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)位于 org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:257)位于 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)位于 invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.lang.reflect.Method.invoke(Method.java:606) org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:311) 位于com.sun.proxy.$Proxy161.getResultList(未知源) com.ge.turbo.repository.KpiTaskRepositoryCustomImpl.getKPIData(KpiTaskRepositoryCustomImpl.java:93) 位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.lang.reflect.Method.invoke(Method.java:606) org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:333) 在 org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:308) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172) 在 org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) 在 org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:260) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) 在 org.springframework.aop.framewo