首页 > 解决方案 > 当嵌套实体为空时,条件生成器不返回实体

问题描述

我有一个根实体“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 与第一个谓词匹配,空客户也会使查询与该实体不匹配。

标签: javapredicatecriteria-api

解决方案


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

现在我用左连接为 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")
)

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


推荐阅读