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();
Suponho que você construiu o metamodelo JPA para suas classes. Se você não tiver o metamodelo ou simplesmente não quiser usá-lo, basta substituir
BuildDetails_.buildNumber
e o resto com os nomes reais da coluna como String
, por exemplo. "buildNumber"
. Observe que não consegui testar a resposta (também estava escrevendo sem suporte do editor), mas ela deve conter pelo menos tudo o que você precisa saber para construir a consulta.
Como construir seu metamodelo? Dê uma olhada em ferramentas de hibernação para isso (ou consulte Como gerar metamodelo JPA 2.0 ? para outras alternativas). Se você estiver usando o maven, pode ser tão simples quanto adicionar o
hibernate-jpamodelgen
-dependency para seu caminho de classe de construção. Como eu não tenho nenhum projeto agora disponível, não tenho tanta certeza sobre o seguinte (então leve isso com um grão de sal). Pode ser suficiente apenas adicionar o seguinte como dependência:<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>