首页 > 学院 > 开发设计 > 正文

ComparisonPredicate render NullPointException

2019-11-06 06:51:30
字体:
来源:转载
供稿:网友

讲SQL改为CriteriaBuilder的方式查询,报了个错误

java.lang.NullPointerException at org.hibernate.jpa.criteria.PRedicate.ComparisonPredicate.render(ComparisonPredicate.java:187)

检查了所有查询条件,没有类属性书写错误,那为什么还会发生绑定错误呢?

将断点设置在第一个报错的位置,进行调试,该断代码是:

public String render(boolean isNegated, RenderingContext renderingContext) { return ((Renderable)this.getLeftHandOperand()).render(renderingContext) + this.getComparisonOperator(isNegated).rendered() + ((Renderable)this.getRightHandOperand()).render(renderingContext); }

当断点在此方法中,查看表达式的值,此表达式由三部分组成,第一部分是目标字段,第二部分为连接符”<>”,第三部分为条件值,分别查看值,发现第三部分报了NullPointException

((Renderable)this.getRightHandOperand()).render(renderingContext)

那只好去检查自己的表达式中有关这个字段的部分了。

我的代码中有关这个字段的表达式是这样的。

predicates.add(cb.or(cb.equal(cl_createUser, userId),cb.equal(cl_createUser, null)));

这个表达式是个or语句,那我就试着用一个条件先查

predicates.add(cb.equal(cl_createUser, userId))

单独用这部分的时候是正常的,加上后面一部分就出了错误,这什么道理?

原来Predicate的equal方法是不允许和null比较的,这个文档上没有说明equal的Exception,但人家提供了isNullisNotNull方法。

改成这样就OK了

predicates.add(cb.or(cb.equal(cl_createUser, userId),cb.isNull(cl_createUser)));

实际上SQL也没有xx=null的写法,基本都是xx is null。 这样看来还是自己的SQL问题,捂脸。。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表