Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Hibernate CriteriaBuilder, um mehrere Tabellen zusammenzuführen

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

Ich nehme an, Sie haben das JPA-Metamodell für Ihre Klassen erstellt. Wenn Sie das Metamodell nicht haben oder es einfach nicht verwenden möchten, ersetzen Sie einfach BuildDetails_.buildNumber und der Rest mit den tatsächlichen Namen der Spalten als String , z.B. "buildNumber" .

Beachten Sie, dass ich die Antwort nicht testen konnte (habe sie auch ohne Editorunterstützung geschrieben), aber sie sollte zumindest alles enthalten, was Sie wissen müssen, um die Abfrage zu erstellen.

Wie baut man sein Metamodell auf? Sehen Sie sich Hibernate-Tools an dafür (oder konsultieren Sie How to generate JPA 2.0 metamodel ? für andere Alternativen). Wenn Sie Maven verwenden, kann es so einfach sein, einfach das hibernate-jpamodelgen hinzuzufügen -Abhängigkeit von Ihrem Build-Klassenpfad. Da ich derzeit kein solches Projekt zur Verfügung habe, bin ich mir bei dem Folgenden nicht so sicher (also nehmen Sie das mit einem Körnchen Salz). Es könnte ausreichen, einfach Folgendes als Abhängigkeit hinzuzufügen:

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