【发布时间】: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