sql >> Base de Datos >  >> RDS >> Mysql

Hibernate CriteriaBuilder para unir múltiples tablas

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

Supongo que construyó el metamodelo JPA para sus clases. Si no tiene el metamodelo o simplemente no quiere usarlo, simplemente reemplace BuildDetails_.buildNumber y el resto con los nombres reales de la columna como String , p.ej. "buildNumber" .

Tenga en cuenta que no pude probar la respuesta (también la estaba escribiendo sin el soporte del editor), pero al menos debería contener todo lo que necesita saber para construir la consulta.

¿Cómo construir tu metamodelo? Eche un vistazo a las herramientas de hibernación para eso (o consulte Cómo generar el metamodelo JPA 2.0 ? para otras alternativas). Si está utilizando maven, puede ser tan simple como agregar hibernate-jpamodelgen -dependencia de su classpath de compilación. Como no tengo ningún proyecto de este tipo ahora disponible, no estoy tan seguro de lo siguiente (así que tómalo con pinzas). Podría ser suficiente simplemente agregar lo siguiente como dependencia:

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