【问题标题】:How does CriteriaBuilder.equal() treat null values?CriteriaBuilder.equal() 如何处理空值?
【发布时间】:2017-01-14 07:26:49
【问题描述】:

ynull 时,我预计CriteriaBuilder.equal(Expression<?> x, Object y) 总是评估为假,但令我惊讶的是,事实并非如此:对于相关字段也是null 的行,它评估为真(我已经仅针对字符串进行了测试)。

我唯一能找到的就是this explanation,这与我最初的错误假设相对应。

这里到底发生了什么?当ynull 时,CriteriaBuilder.equal(Expression<?> x, Object y) 是否转换为CriteriaBuilder.isNull(Expression<?> x)null 字符串是否转换为 'null'?还是我弄错了?

【问题讨论】:

  • 它是特定于提供程序的,但 EclipseLInk 可以判断您的参数为空,因此当它从条件查询创建表达式时,将相等检查转换为 isNull 检查。如果您使用参数,则情况并非如此,因为表达式可能会在参数传入之前准备好。
  • 谢谢,如果你把它变成答案,我会接受!

标签: null eclipselink jpa-2.0 criteria-api


【解决方案1】:

它是特定于提供程序的,但 EclipseLInk 可以判断您的参数为空,因此当它从条件查询创建表达式时,将相等检查转换为 isNull 检查。如果您使用参数则不是这种情况,因为表达式可能会在参数传入之前准备好。

【讨论】:

    【解决方案2】:

    我使用标准生成器,将 = 替换为 "is null" 不够聪明。所以,我做了类似的事情:

     reportRepo.findAll((r, q, cb) -> parentId == null
                          ? cb.isNull(r.get(Report.Fields.parentId))
                          : cb.equal(r.get(Report.Fields.parentId), parentId))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-27
      • 2014-09-23
      • 1970-01-01
      • 2016-08-18
      • 2012-08-31
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多