1

私はエンティティAa、Bb、Ccからこの構造を持っています:

  • Aa には Bb のリストがあります
  • Bb には Cc のリストがあります

-

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

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

C の ID で Aa をプールする JPA Criteria API クエリを作成したいと思います。

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

ネイティブ SQL では、左結合 (2 回) を試みます。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

各エンティティがその親エンティティへの参照を持っていると仮定すると、 の a へCcの参照がBb呼び出され、の an への参照が呼び出されるとbb、JPQL で次のことができます。BbAaaa

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

これの基準バージョンは単純な翻訳である必要があります。

于 2012-10-28T23:04:24.913 に答える