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

Dvale CriteriaBuilder for at forbinde flere tabeller

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

Jeg går ud fra, at du har bygget JPA-metamodellen til dine klasser. Hvis du ikke har metamodellen, eller du simpelthen ikke vil bruge den, skal du bare erstatte BuildDetails_.buildNumber og resten med de faktiske navne på kolonnen som String , for eksempel. "buildNumber" .

Bemærk, at jeg ikke kunne teste svaret (skrev det også uden editor-understøttelse), men det skulle i det mindste indeholde alt, hvad du behøver at vide for at bygge forespørgslen.

Hvordan bygger man sin metamodel? Tag et kig på dvaleværktøj for det (eller konsulter Sådan genereres JPA 2.0 metamodel ? for andre alternativer). Hvis du bruger maven kan det være så enkelt som blot at tilføje hibernate-jpamodelgen -afhængighed af din byggeklassesti. Da jeg ikke har et sådant projekt tilgængeligt nu, er jeg ikke så sikker på følgende (så tag det med et gran salt). Det kan være tilstrækkeligt blot at tilføje følgende som afhængighed:

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



  1. Android Room Embedded Relation ignorerer SQL where-tilstand

  2. Indsættelse af html-kode i en mysql-tabel

  3. php- få sidste indsættelses-id

  4. Udskiftning af mysql_*-funktioner med PDO og forberedte udsagn