Próbuję utworzyć kryteria pobierania niektórych obiektów z 3 tabel (Associate, Update and Detail). Szczegół ma odniesienie do Associate and Update, a Update ma odniesienie do listy Szczegóły. Moim celem jest pobranie listy Aktualizacje, która ma co najmniej Szczegół z wartością pustą w określonym polu, z uwzględnieniem identyfikatora Associate. W JPQL było to łatwe, ale klient powiedział, że musi to być zakodowane za pomocą kryteriów.Kryteria WZP 2 z 3 tabelami
Moja JPQL było:
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();
}
Próbowałem następujących, ale właśnie wrócił wszystkie aktualizacje bazy danych:
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();
}
Czy ktoś może mi pomóc? Szukałem, ale nie mogę znaleźć żadnego przykładu z trzema elementami.
Pracował jak urok! Łączenie tych kryteriów doprowadzało mnie do szału, ale to bardzo pomogło! Dziękuję za wszystko :) –