我有来自实体Aa,Bb,Cc的这种结构:
-
public class Aa{
@OneToMany
List<Bb> listBb;
}
public class Bb{
@OneToMany
List<Bb> listCc;
}
我想创建一个JPA Criteria API查询,通过ID为C:
来汇集Aapublic A getAaByCcId(long id) {...}
在本机sql中我会尝试左连接(两次)。如何使用JPA执行此操作?
答案 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)
假设每个实体都有对其父实体的引用,其中Cc
对Bb
的引用称为bb
,而Bb
引用{ {1}}被称为Aa
,然后在JPQL中,你可以这样做:
aa
这个标准版应该是一个简单的翻译。