sql >> Databasteknik >  >> RDS >> Mysql

Hibernate CriteriaBuilder för att ansluta till flera 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();

Jag antar att du byggde JPA-metamodellen för dina klasser. Om du inte har metamodellen eller om du helt enkelt inte vill använda den, byt bara ut BuildDetails_.buildNumber och resten med de faktiska namnen på kolumnen som String , t.ex. "buildNumber" .

Observera att jag inte kunde testa svaret (skrev också det utan redaktörsstöd), men det bör åtminstone innehålla allt du behöver veta för att bygga frågan.

Hur bygger man sin metamodell? Ta en titt på hibernate tooling för det (eller konsultera Hur man genererar JPA 2.0-metamodellen ? för andra alternativ). Om du använder maven kan det vara så enkelt som att bara lägga till hibernate-jpamodelgen -beroende av din byggklassväg. Eftersom jag inte har något sådant projekt tillgängligt nu är jag inte så säker på följande (så ta det med en nypa salt). Det kan räcka att bara lägga till följande som beroende:

<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. Oracle trigger efter infogning eller borttagning

  2. Konvertera en MySQL-databas från latin till UTF-8

  3. ORA-00257:arkiveringsfel. Anslut endast internt tills det frigörs.

  4. Datamodellen för viktiga datum