【问题标题】:Criteria Builder does not return an entity when nested entity is null当嵌套实体为空时,条件生成器不返回实体
【发布时间】:2020-11-16 06:50:04
【问题描述】:

我有一个根实体“caseHeader”,其中包含一些嵌套实体(--> activeCase --> customer)。我正在使用标准构建器来动态搜索这些实体。我正在尝试创建一个谓词,它将匹配多个字段,包括嵌套实体(客户端)的字段之一。所以我尝试了这样的事情:

criteriaBuilder.or(
  criteriaBuilder.equal(caseHeaderRoot.get("id"), "1234"),
  criteriaBuilder.equal(caseHeaderRoot.get("activeCase").get("customer").get("uniqueId"), "1234")
)

好吧,如果客户不为空,那么这将按预期工作。它返回 ID 或客户唯一 ID 等于“1234”的实体。但如果有一个 id 为“1234”且没有客户的实体,则该实体不会包含在结果集中,即使第一个谓词应该匹配它。

我试图像这样检查空客户:

criteriaBuilder.or(
  criteriaBuilder.equal(caseHeaderRoot.get("id"), "1234"),
  criteriaBuilder.and(
    criteriaBuilder.isNotNull(caseHeaderRoot.get("activeCase").get("customer")),
    criteriaBuilder.equal(caseHeaderRoot.get("activeCase").get("customer").get("uniqueId"), "1234")
  )
)

我也尝试使用元模型而不是字符串,以避免在我的模型中出现拼写错误,但结果是一样的。

我错过了什么?为什么即使根实体 ID 与第一个谓词匹配,空客户也会使查询与该实体不匹配。

【问题讨论】:

    标签: java predicate criteria-api


    【解决方案1】:

    我已经发现它是什么,以防有人陷入同样的​​陷阱,这是我修复它的方法......

    现在我用左连接为 activeCase 和客户加入根,如下所示:

    Join customerJoin = caseHeaderRoot.join("activeCase", JoinType.LEFT).join("customer", JoinType.LEFT);
    criteriaBuilder.or(
      criteriaBuilder.equal(caseHeaderRoot.get("id"), "1234"),
      criteriaBuilder.equal(customerJoin.get("uniqueId"), "1234")
    )
    

    我认为这对其他人也有帮助。 :)

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 2020-07-21
      • 2014-06-18
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      相关资源
      最近更新 更多