1

我有来自实体 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 执行此操作?

4

2 回答 2

2

您还可以使用 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();
于 2012-10-28T11:31:11.157 回答
0

假设每个实体都有对其父实体的引用,其中Cc' 对 a 的引用Bb被称为' 对 an 的引用被称为bb,那么在 JPQL 中,您可以执行以下操作:BbAaaa

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

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

于 2012-10-28T23:04:24.913 回答