【问题标题】:JPA left/right join queryJPA左/右连接查询
【发布时间】:2012-10-28 11:22:30
【问题描述】:

我有这个来自实体 Aa、Bb、Cc 的结构:

  • Aa 有一个 Bb 列表
  • Bb 有一个抄送列表

-

public class Aa{
@OneToMany   
List<Bb> listBb;
}

public class Bb{
@OneToMany 
List<Bb> listCc;
}

我想创建一个 JPA Criteria API 查询以通过 C 的 id 池化 Aa:

public A getAaByCcId(long id) {...}

在本机 sql 中,我会尝试左连接(两次)。我如何使用 JPA 做到这一点?

【问题讨论】:

  • 你是否也有其他方向的映射,所以 Cc 有一个 Bb,Bb 有一个 Aa?如果是这样,那么沿着这些查询可能是最容易的。
  • 是的,我也有@ManyToOne,但它很懒
  • 懒惰对查询无关紧要 - 如果映射存在,您可以在查询中使用它。

标签: java jpa jpa-2.0


【解决方案1】:

您也可以使用 JPQL 中的连接来实现:

select a from Aa a
inner join a.listBb b
inner join b.listCc c
where c.id = :cId

请注意,这里可以使用内连接,因为您对c.id = :cId 有限制,只有在 B 和 C 存在时才适用。但是你也可以使用左连接。

编辑:

使用 Criteria 查询,它将如下所示(未经测试):

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Aa> criteria = builder.createQuery(Aa.class);
Root<Aa> a = criteria.from(Aa.class);
CollectionJoin<Aa, Bb> b = a.join(Aa_.listBb);
CollectionJoin<Bb, Cc> c = b.join(Bb_.listCc);
criteria.where(builder.equal(c.get(Cc_.id), cId));
return em.createQuery(criteria).getResultList();

【讨论】:

  • 感谢 JB,但我正在尝试使用 JPA Criteria API 而不是 JPQL
  • 查看我编辑的答案。除非您真的有动态生成的查询,否则我会避免使用令人困惑的(恕我直言)标准 API。
  • 谢谢!奇迹般有效。在我之前的项目中,我使用 JPQL 构建了我的 dal,现在决定尝试 JPA Criteria API。我不确定我是否收到您关于“混淆标准 API”的评论,您能否详细说明一下?
  • 我发现 API 难以理解和掌握,缺乏一致性,难以使用,并且产生难以阅读的代码。 JPQL 查询更容易理解。
  • 我倾向于同意。再次感谢。
【解决方案2】:

假设每个实体都有对其父实体的引用,其中CcBb 的引用称为bbBbAa 的引用称为aa,然后在 JPQL 中,你可以这样做:

select cc.bb.aa from Cc cc where cc.id = ?

这个的标准版本应该是一个简单的翻译。

【讨论】:

    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    相关资源
    最近更新 更多