CriteriaBuilder.equal() 如何处理空值?
How does CriteriaBuilder.equal() treat null values?
我预计 CriteriaBuilder.equal(Expression<?> x, Object y)
在 y
为 null
时始终计算为 false,但令我惊讶的是,事实并非如此:它对相关字段所在的行计算为 true还有 null
(我只针对字符串测试过)。
我唯一能找到的是 this explanation,这符合我错误的初始假设。
这里到底发生了什么?当y
是null
时,CriteriaBuilder.equal(Expression<?> x, Object y)
是否变成了CriteriaBuilder.isNull(Expression<?> x)
? null
字符串是否转换为 'null'
?还是我搞错了?
它是特定于提供者的,但 EclipseLInk 可以判断您的参数为空,因此当它根据条件查询创建表达式时,将相等性检查转换为 isNull 检查。如果您使用的是参数,则情况并非如此,因为在传入参数之前可能会准备好表达式。
我使用标准构建器,它不够聪明,无法将 = 替换为“is null”。所以,我做了类似的事情:
reportRepo.findAll((r, q, cb) -> parentId == null
? cb.isNull(r.get(Report.Fields.parentId))
: cb.equal(r.get(Report.Fields.parentId), parentId))