JPA左/右连接查询

时间:2012-10-28 11:22:30

标签: java jpa jpa-2.0

我有来自实体Aa,Bb,Cc的这种结构:

  • Aa有一个Bb
  • 列表
  • Bb有一个Cc
  • 列表

-

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

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

我想创建一个JPA Criteria API查询,通过ID为C:

来汇集Aa
public A getAaByCcId(long id) {...}

在本机sql中我会尝试左连接(两次)。如何使用JPA执行此操作?

2 个答案:

答案 0 :(得分: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时才能为true。但你也可以使用左连接。

编辑:

使用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();

答案 1 :(得分:0)

假设每个实体都有对其父实体的引用,其中CcBb的引用称为bb,而Bb引用{ {1}}被称为Aa,然后在JPQL中,你可以这样做:

aa

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