Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有JPA creteria查询的NullPointerException,带有where子句上的筛选条件_Java_Mysql_Jpa_Filter_Criteria - Fatal编程技术网

Java 带有JPA creteria查询的NullPointerException,带有where子句上的筛选条件

Java 带有JPA creteria查询的NullPointerException,带有where子句上的筛选条件,java,mysql,jpa,filter,criteria,Java,Mysql,Jpa,Filter,Criteria,我编写了一个creteria查询,关于where条件包括and,or,类似于带有过滤条件的操作符。我的creteria查询执行在没有过滤条件的情况下运行良好。但如果我给出过滤条件,它会给我NullPointerException。我已经提到了下面的链接,但它不与过滤条件 Creteria查询代码: List<TbiDDDetailView> tbiDDDetailViews = tbiDDDetailViewDao.findByDomainIdAndMetricNameLike(

我编写了一个creteria查询,关于where条件包括and,or,类似于带有过滤条件的操作符。我的creteria查询执行在没有过滤条件的情况下运行良好。但如果我给出过滤条件,它会给我NullPointerException。我已经提到了下面的链接,但它不与过滤条件

Creteria查询代码:

List<TbiDDDetailView> tbiDDDetailViews  = tbiDDDetailViewDao.findByDomainIdAndMetricNameLike(domainId, searchString);

            CriteriaBuilder cb=em.getCriteriaBuilder();
            CriteriaQuery<TbiDDDetailView> qry =cb.createQuery(TbiDDDetailView.class);
            Root root = qry.from(TbiDDDetailView.class);
            Root config = qry.from(TbiDDConfigMaster.class);

            List<Order> orderList = new ArrayList<>();
            orderList = getSort(cb,root,sortProperties, sortTypes, null);
            qry.orderBy(orderList);

            List creteriaList = new ArrayList<>();
            Predicate predicate1 = cb.equal(root.get("tbiDDConfigMaster").get("ddConfigId"), config.get("ddConfigId"));
            creteriaList.add(predicate1);

            Predicate predicate2 = cb.equal(root.get("tbiDDConfigMaster").get("domainId"), domainId);
            creteriaList.add(predicate2);

            Predicate predicate3 = cb.or(cb.like(root.get("tbiDDConfigMaster").get("keywords"), "%"+searchString+"%"),cb.like(root.get("metricName"),"%"+searchString+"%"));

            CriteriaQuery<TbiDDDetailView> criteriaQuery = qry.select(cb.construct(TbiDDDetailView.class, root.get("ddConfigId"),root.get("metricName"),root.get("ddType"),
                    root.get("ddName"),root.get("discoveryId"),root.get("keywords")));

            //filter
            Predicate filterCondition = cb.conjunction();
            try {
                Path<Integer> pathFilter = (Path<Integer>) getPath("isActive", root, null);
                filterCondition=cb.and(cb.equal(pathFilter,"Y"));
                filterCondition = getFilters(filterCondition, cb, root, property, operator, value, null);

            } catch (JSONException e) {
                e.printStackTrace();
                log.info("Error In filter isActive", e);
            }
            qry.where(filterCondition,cb.and((Predicate[]) creteriaList.toArray(new Predicate[0])), predicate3);
            TypedQuery<TbiDDDetailView> tq = em.createQuery(qry); //NullPointerException at this line
return tbiDDDetailViews = tq.getResultList();  
普通MySql查询:

select d.* from tbi_datadiscovery_detail_view d join tbi_dd_config_master c on d.dd_metric_id = c.dd_metric_config_id 
where c.domain_id = 1 and d.dd_metric_name like "%exp%" or d.key_words like "%exp%"  

我已经使用
谓词将这个MySql查询转换为
Creteria查询
。请让我知道我在使用过滤条件时哪里做错了

我已经找到了问题的解决方案

问题是,我将
filterCondition
直接添加到
qry。where()
相反,我应该将它添加到
creteriaList
,就像我对其他
谓词所做的那样

最后几行的更改我的代码(
CriteriaQuery
):

//过滤器
谓词filterCondition=cb.conjunction();
试一试{
Path pathFilter=(Path)getPath(“isActive”,root,null);
filterCondition=cb.和(cb.相等(路径过滤器,“Y”);
filterCondition=getFilters(filterCondition,cb,根,属性,运算符,值,null);
}捕获(JSONException e){
e、 printStackTrace();
log.info(“过滤器中的错误是活动的”,e);
}
creteriaList.add(过滤条件);
谓词谓词3=(cb.or(cb.like(root.get(“tbiDDConfigMaster”).get(“关键字”),“%”+searchString+“%”),cb.like(root.get(“metricName”),“%”+searchString+“%”);
creteriaList.add(谓词3);
qry.where(cb.和((谓词[])creteriaList.toArray(新谓词[0]));

这是LikePredicate的问题,NPE总是因为用户的错误。由于您没有发布整个stacktrace,因此很难找到NPE发生的位置。调试代码,您就会知道我已经编辑了我的问题并添加了完整的堆栈跟踪。您应该从查看
ReportJobsPersistenceServiceImpl.java:8841
开始,如果您可以调试代码并查看从何处获得NPEI,则更好地调试代码并检查。出现错误“TypedQuery tq=em.createQuery(qry);”为此,您的hibernate版本是什么?
select d.* from tbi_datadiscovery_detail_view d join tbi_dd_config_master c on d.dd_metric_id = c.dd_metric_config_id 
where c.domain_id = 1 and d.dd_metric_name like "%exp%" or d.key_words like "%exp%"  
//filter
Predicate filterCondition = cb.conjunction();
try {
    Path<Integer> pathFilter = (Path<Integer>) getPath("isActive", root, null);
    filterCondition=cb.and(cb.equal(pathFilter,"Y"));
    filterCondition = getFilters(filterCondition, cb, root, property, operator, value, null);

    } catch (JSONException e) {
           e.printStackTrace();
           log.info("Error In filter isActive", e);
    }
creteriaList.add(filterCondition);  
Predicate predicate3 = (cb.or(cb.like(root.get("tbiDDConfigMaster").get("keywords"), "%"+searchString+"%"),cb.like(root.get("metricName"),"%"+searchString+"%")));
creteriaList.add(predicate3);
qry.where(cb.and((Predicate[]) creteriaList.toArray(new Predicate[0])));