我有一个带有一些嵌套实体(-> 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会匹配第一个谓词。
答案 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")
)
我认为这也可以帮助其他人。 :)