讲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,但人家提供了isNull和isNotNull方法。
改成这样就OK了
predicates.add(cb.or(cb.equal(cl_createUser, userId),cb.isNull(cl_createUser)));
实际上SQL也没有xx=null的写法,基本都是xx is null。
这样看来还是自己的SQL问题,捂脸。。