Java 带有JPA creteria查询的NullPointerException,带有where子句上的筛选条件
我编写了一个creteria查询,关于where条件包括and,or,类似于带有过滤条件的操作符。我的creteria查询执行在没有过滤条件的情况下运行良好。但如果我给出过滤条件,它会给我NullPointerException。我已经提到了下面的链接,但它不与过滤条件 Creteria查询代码: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(
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])));