JPA CriteriaQuery を使用して複合選択を行う際に問題があります。私は 3 つのテーブル X->Y->Z を持っています。すべての XI には 1 つ以上の Y があり、すべての YI には 1 つ以上の Z があります。X オブジェクトがあり、1 つの X に対して Z のすべての出現を選択しようとしています。
私が使用しているコード:
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Z> criteriaQuery = cb .createQuery(Z.class); Root<Z> fromZ = criteriaQuery.from(Z.class); X xObj = new X(xObjId); Subquery<Y> subquery = criteriaQuery.subquery(Y.class); Root<Y> fromY = subquery.from(Y.class); subquery.select(fromY.<Y> get("Yid")).distinct(true) .where(cb.equal(fromY.get("Xid"), xObj)); criteriaQuery .select(fromZ) .where(cb.and( cb.in(from.get("Yid")).value(subquery), cb.and(cb.equal(from.get("Zcolumn1"), 0), cb.equal(from.get("Zcolumn2"), 1)))) .orderBy(cb.asc(from.get("Zcolumn3"))); TypedQuery<Z> typedQuery = em.createQuery(criteriaQuery); List<Z> results = typedQuery.getResultList();
Xid と Yid は、それぞれの Y Bean と Z Bean の外部キーです。
無効な SQL があるため、このコードは実行ポイントでエラーを生成します。
SELECT t0.Zcolumn1, t0.Zcolumn2, t0.Zcolumn3, FROM Z t0 WHERE (t0.Yid IN ( SELECT t1.Yid.t1.Yid FROM Y t1 WHERE (t1.Xid = ?)) AND (((t0.Zcolumn1 = ?) AND (t0.Zcolumn2 = ?))) ORDER BY t0.Zcolumn3 ASC
サブクエリによって Yid が 2 回生成される理由がわかりません。修正方法もわかりません。見つけて適応させた例によると、これはうまくいくと思います。SubQuery を使用するのはこれが初めてなので、私のコード スタイルの可能性のあるばかげたエラーを許してください :)
ありがとうございました。