Mysql
 sql >> Database >  >> RDS >> Mysql

Ibernare CriteriaBuilder per unire più tabelle

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();

Presumo che tu abbia creato il metamodello JPA per le tue classi. Se non hai il metamodello o semplicemente non vuoi usarlo, sostituisci semplicemente BuildDetails_.buildNumber e il resto con i nomi effettivi della colonna come String , per esempio. "buildNumber" .

Nota che non ho potuto testare la risposta (la stavo scrivendo anche senza il supporto dell'editor), ma dovrebbe almeno contenere tutto ciò che devi sapere per creare la query.

Come costruire il tuo metamodello? Dai un'occhiata a ibernazione strumenti per questo (o consulta Come generare il metamodello JPA 2.0 ? per altre alternative). Se stai usando Maven può essere semplice come aggiungere hibernate-jpamodelgen -dipendenza dal tuo percorso di classe build. Dato che non ho alcun progetto del genere ora disponibile, non sono così sicuro di quanto segue (quindi prendilo con le pinze). Potrebbe essere sufficiente aggiungere solo quanto segue come dipendenza:

<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>