Mysql
 sql >> Base de données >  >> RDS >> Mysql

Hibernate CriteriaBuilder pour joindre plusieurs tables

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

Je suppose que vous avez construit le métamodèle JPA pour vos classes. Si vous n'avez pas le métamodèle ou si vous ne voulez tout simplement pas l'utiliser, remplacez simplement BuildDetails_.buildNumber et le reste avec les noms réels de la colonne sous la forme String , par exemple. "buildNumber" .

Notez que je n'ai pas pu tester la réponse (je l'écrivais également sans le support de l'éditeur), mais elle devrait au moins contenir tout ce que vous devez savoir pour créer la requête.

Comment construire votre métamodèle ? Jetez un oeil à outils d'hibernation pour cela (ou consultez Comment générer le métamodèle JPA 2.0 ? pour les autres variantes). Si vous utilisez maven, cela peut être aussi simple que d'ajouter le hibernate-jpamodelgen -dépendance à votre chemin de classe de construction. Comme je n'ai pas de projet de ce type actuellement disponible, je ne suis pas si sûr de ce qui suit (prenez donc cela avec un grain de sel). Il peut suffire d'ajouter simplement ce qui suit comme dépendance :

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