1

これが私のショーケースコードです:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<AA> aa = q.from(AA.class);

q.multiselect(aa.get("id").alias("id"),
articolo.get("a").alias("a"),
articolo.get("b").alias("b"),
articolo.get("c").get("t").alias("c"),
articolo.get("d").alias("d"));

System.out.println("RootCount: "+q.getRoots().size());

Query query = em.createQuery(q);
List<Tuple> list = query.getResultList();

ここで、AAはマップされたテーブルであり、cはCCタイプのアイテムです(CCは別のマップされたテーブルです)。

ええと、私は画像を挿入することを許可されていないので、テーブルスキーマ

cは、テーブルCCを参照する外部キーです。

したがって、上記のコードは「RootCount:1」(ルートは1つのみ)を出力しますが、結果のクエリは次のようになります。

select aa.id, aa.a, aa.b, cc.t, aa.d from AA aa, CC cc where aa.c=cc.id

つまり...2つのルートですが、q.getRoots()は、明示的に定義したルートのみを報告します。

どうすれば本当のルーツを手に入れることができますか?

4

1 に答える 1

2

ルートは1つだけです。とはいえ、複数のルートを宣言し、それらを手動で結合することを妨げるものは何もありません。

Root<AA> aa = query.from(AA.class)
Path<CC> aaToCc = aa.get("c");
Root<CC> cc = query.from(CC.class)

cb.where(cb.equal(aaToCcId, cc));

秘訣は、CCルートは実際には必要ないということです。Path<CC>ルートのように使用できます。または、を使用することもできますaa.join

于 2011-02-28T02:08:02.503 に答える