sql >> Database >  >> RDS >> Mysql

Hibernate CriteriaBuilder om meerdere tabellen samen te voegen

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

Ik neem aan dat je het JPA-metamodel voor je lessen hebt gebouwd. Als je het metamodel niet hebt of je wilt het gewoon niet gebruiken, vervang dan gewoon BuildDetails_.buildNumber en de rest met de werkelijke namen van de kolom als String , bijv. "buildNumber" .

Merk op dat ik het antwoord niet kon testen (ik schreef het ook zonder ondersteuning van de editor), maar het zou op zijn minst alles moeten bevatten wat je moet weten om de query te bouwen.

Hoe bouw je je metamodel? Kijk eens naar hibernate-tooling daarvoor (of raadpleeg Hoe JPA 2.0 metamodel te genereren ? voor andere alternatieven). Als je maven gebruikt, kan het zo simpel zijn als het toevoegen van de hibernate-jpamodelgen -afhankelijkheid van uw build classpath. Aangezien ik nu niet zo'n project beschikbaar heb, ben ik niet zo zeker van het volgende (dus neem dat met een korreltje zout). Het kan voldoende zijn om het volgende als afhankelijkheid toe te voegen:

<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. Cronjob elke minuut

  2. MySql-instructie invoegen naar binair gegevenstype?

  3. Facebook-ID opslaan als int of varchar?

  4. Een alias gebruiken in SQL-berekeningen