3 つのテーブル (Associate、Update、Detail) からいくつかのオブジェクトを取得するための条件を作成しようとしています。Detail は Associate と Update を参照し、Update は Details のリストを参照します。私の目的は、Associate ID を指定して、指定されたフィールドに少なくとも 1 つの Detail の null 値がある Update のリストを取得することです。JPQL では簡単に実行できましたが、クライアントはこれを条件付きでコーディングする必要があると言いました。
私の JPQL は次のとおりです:
public List<Update> getUpdates(long associateId) {
TypedQuery<Update> query = em.createQuery("select distinct u from Update u, Detail dt, Associate a "
+ "where dt.update = u and dt.associate = a and a.associateId = :id and "
+ "dt.ack_date is null", Update.class);
query.setParameter("id", associateId);
return query.getResultList();
}
次のことを試しましたが、データベース内のすべての更新が返されるだけでした。
public List<Update> getUpdates(long associateId) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Update> query = builder.createQuery(Update.class);
Root<Update> fromUpdates = query.from(Update.class);
Root<Associate> fromAssociate = query.from(Associate.class);
Root<Detail> fromDetail = query.from(Detail.class);
Join<Detail, Associate> associateJoin = fromDetail.join("associate");
Join<Detail, Update> updateJoin = fromDetail.join("update");
TypedQuery<Update> typedQuery = em.createQuery(query
.select(fromUpdates)
.where(builder.and(
builder.equal(fromAssociate.get("associateId"), associateId),
builder.equal(fromDetail.get("associate"), associateJoin),
builder.equal(fromDetail.get("update"), updateJoin),
builder.isNull(fromDetail.get("ack_date"))
))
.orderBy(builder.asc(fromUpdates.get("updateId")))
.distinct(true)
);
return typedQuery.getResultList();
}
誰か助けてくれませんか? 検索しましたが、3 つのエンティティの例が見つかりません。
ベストアンサー1
各結合は、左寄りの型パラメータから右寄りの型パラメータに移動します。したがって、details
私のコード (2 行目) の結合はfromUpdates
、つまりから始まりPath<Update>
、舞台裏でも であるものを作成しますPath<Detail>
。そこから、他の結合を構築できます。これを試してください (コードはテストされていません)。
Root<Update> fromUpdates = query.from(Update.class);
Join<Update, Detail> details = fromUpdates.join("details");
Join<Detail, Associate> associate = details.join("associate");
List<Predicate> conditions = new ArrayList();
conditions.add(builder.equal(associate.get("associateId"), associateId));
conditions.add(builder.isNull(details.get("ack_date")));
TypedQuery<Update> typedQuery = em.createQuery(query
.select(fromUpdates)
.where(conditions.toArray(new Predicate[] {}))
.orderBy(builder.asc(fromUpdates.get("updateId")))
.distinct(true)
);