java - 当嵌套实体为空时,条件生成器不返回实体
问题描述
我有一个根实体“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 与第一个谓词匹配,空客户也会使查询与该实体不匹配。
解决方案
我已经发现它是什么,以防有人落入同一个陷阱,这就是我修复它的方法......
现在我用左连接为 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")
)
我认为这对其他人也有帮助。:)
推荐阅读
- python - 在python中使用图形索引
- swift - 在 Firebase 中将本地化日期转换为时间戳
- sql - Postgresql 比较 varchar 和 time 类型
- react-admin - 如何从菜单中删除指向资源列表视图的链接?
- java - 如何为 htmleditorkit 设置换行行为
- ruby-on-rails - 通过控制器查询拉取Activerecord连接表信息
- oracle - 为什么我的 Oracle DataSource 只有在单元测试时才会出现重放错误?
- javascript - 根据 JSON 数据在 d3v4 蝙蝠图上设置自定义刻度值
- node.js - firebase.database() 多个实例
- c# - 如何从 .Net Core Web API 返回 Json?