【问题标题】:How to do a left outer join using criteria query on unassociated entities?如何在未关联的实体上使用条件查询进行左外连接?
【发布时间】:2021-11-24 20:46:19
【问题描述】:
StringBuffer buffer = new StringBuffer();
buffer.setLength(0);
buffer.append("select phone.name,phone.id,object.name,object.id  from Phone as phone");
if(isA){
  buffer.append("left outer join A as object where object.id=phone.id")
}
else{
  buffer.append("left outer join B as object where object.id=phone.id")
}

我在旧代码中有这样的 SQL 命令。我必须将其转换为 JPA。

如果Phone与A和B之间没有任何关系,如何使用条件查询来实现?

【问题讨论】:

标签: hibernate jpa hibernate-criteria criteria-api criteriaquery


【解决方案1】:

如果 Phone 是 JPA 管理的实体,但不是 AB,您可以使用本机查询而不是 Criteria API。这样,您可以按原样从旧代码中获取 SQL 查询并将其与 JPA 一起使用。

String nativeSql = buffer.toString();
List<Phone> phones = entityManager.createNativeQuery(nativeSql, Phone.class).getResultList();

【讨论】:

  • 感谢巴斯蒂安的回复。在我的实际场景中,查询有点庞大,包含大约 7 个 if-else 条件,每个条件都有一个左外连接。我避免在代码中直接使用查询。这就是我计划使用标准的原因。有什么想法吗?
【解决方案2】:

不幸的是,JPA Criteria 无法做到这一点,因为目前还没有用于此的 API。在 Hibernate 6.0 中将有一个扩展支持这一点。

现在,您可以继续像您看起来那样连接 JPQL 片段,也可以使用支持此功能的查询构建器,例如 Blaze-Persistence

CriteriaBuilder<Tuple> cb = criteriaBuilderFactory.create(entityManager, Tuple.class);
cb.from(Phone.class, "p");
cb.select("p.name").select("p.id").select("o.name").select("o.id");
if(isA) {
  cb.leftJoin(A.class, "o").on("o.id").eqExpression("p.id").end();
}
else{
  cb.leftJoin(B.class, "o").on("o.id").eqExpression("p.id").end();
}
List<Tuple> result = cb.getResultList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 2022-07-29
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多