CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery query = cb.createQuery(/* Your combined target type, e.g. MyQueriedBuildDetails.class, containing buildNumber, duration, code health, etc.*/);
Root<BuildDetails> buildDetailsTable = query.from(BuildDetails.class);
Join<BuildDetails, CopyQualityDetails> qualityJoin = buildDetailsTable.join(CopyQualityDetails_.build, JoinType.INNER);
Join<BuildDetails, DeploymentDetails> deploymentJoin = buildDetailsTable.join(DeploymentDetails_.build, JoinType.INNER);
Join<BuildDetails, TestDetails> testJoin = buildDetailsTable.join(TestDetails_.build, JoinType.INNER);
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(buildDetailsTable.get(BuildDetails_.buildNumber), "1.0.0.1"));
predicates.add(cb.equal(buildDetailsTable.get(BuildDetails_.projectName), "Tera"));
query.multiselect(buildDetails.get(BuildDetails_.buildNumber),
buildDetails.get(BuildDetails_.buildDuration),
qualityJoin.get(CodeQualityDetails_.codeHealth),
deploymentJoin.get(DeploymentDetails_.deployedEnv),
testJoin.get(TestDetails_.testStatus));
query.where(predicates.stream().toArray(Predicate[]::new));
TypedQuery<MyQueriedBuildDetails> typedQuery = entityManager.createQuery(query);
List<MyQueriedBuildDetails> resultList = typedQuery.getResultList();
Zakładam, że zbudowałeś metamodel JPA dla swoich zajęć. Jeśli nie masz metamodelu lub po prostu nie chcesz go używać, po prostu zastąp BuildDetails_.buildNumber
a reszta z rzeczywistymi nazwami kolumny jako String
, np. "buildNumber"
.
Zauważ, że nie mogłem przetestować odpowiedzi (pisałem ją również bez wsparcia edytora), ale powinna ona przynajmniej zawierać wszystko, co musisz wiedzieć, aby zbudować zapytanie.
Jak zbudować swój metamodel? Spójrz na narzędzia do hibernacji
w tym celu (lub skonsultuj się z Jak wygenerować metamodel JPA 2.0 ?
dla innych alternatyw). Jeśli używasz maven, może to być tak proste, jak dodanie hibernate-jpamodelgen
- zależność od ścieżki klasy kompilacji. Ponieważ nie mam obecnie żadnego takiego projektu, nie jestem pewien co do poniższych (więc weź to z przymrużeniem oka). Wystarczy dodać jako zależność:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>5.3.7.Final</version>
<scope>provided</scope> <!-- this might ensure that you do not package it, but that it is otherwise available; untested now, but I think I used it that way in the past -->
</dependency>