当嵌套实体为null时,Criteria Builder不返回实体

时间:2020-07-26 23:32:02

标签: java predicate criteria-api

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

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会匹配第一个谓词。

1 个答案:

答案 0 :(得分:0)

我发现它是什么,以防万一有人掉进了同一个陷阱,这是我如何解决的...

现在,我像这样用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")
)

我认为这也可以帮助其他人。 :)